2011-10-06 92 views
3

我有一个嵌入了多个Matplotlib数字的页面。附图获得插入/通过Ajax(为了与时间戳获得由浏览器重新加载)操作如下:避免网络上多个Matplotlib数字之间的干扰

<img src="/charts/somedata.png?time=' + str(time.time()) + '" /> 

然后网址匹配于像的视图(我应该指出,我使用Django) :

(r'^charts/(?P<chart>[A-Za-z_]+).png$', 'views.charts'), 

def charts(request, chart): 
    # Dynamically loading the appropriate module 
    chart_module = import_module('functions.charts.' + chart) 
    return chart_module.show_chart(request) 

图表模块(somedata.py)是这样的:

from __future__ import division 
from django.http import HttpResponseRedirect, HttpResponse 

def show_chart(request): 
    try: 
     # Initiating figure 
     from matplotlib.pyplot import figure 
     from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
     fig1 = figure(figsize=(5.33,4), facecolor = 'white') 
     ax = fig1.add_axes([0.02,0.02,0.98,0.98], aspect='equal') 

     # Some plotting to ax 

     canvas=FigureCanvas(fig1) 
     response=HttpResponse(content_type='image/png') 
     canvas.print_png(response) 
     fig1.clear() 
     return response 

    except: 
     return HttpResponseRedirect("/") 

随着matplotlib版本0.99。?我有时会遇到这样的问题,即一张图表的一部分是在同一页面上的另一张图表中绘制的。有时候,重新加载后,这个问题就解决了。我想出了解决的办法是把下面的settings.py:

# Force matplotlib to NOT use any Xwindows backend. 
# This is necessary before importing pyplot or anything else from matplotlib 
import matplotlib 
matplotlib.use('Agg') 

但是,更新到matplotlib 1.0.1版后,问题又回来了。这些数字是互相干涉的,还是数字的一部分根本没有绘制?关于问题出在哪里的任何想法?

编辑:在一个两个情节的例子。最上面的线条属于另一个人物,他们在那里失踪。我还应该提到,这从来不是在本地运行开发服务器的问题! Oops: Something went wrong!

+0

你可以告诉我们一个例子PNG上绘制两个绘图吗? – jozzas

+0

@jozzas请参阅我上面的编辑:这很烦人,但经常在重新加载后解决。任何想法可能取决于什么? – Meilo

+1

我会将您的matplotlib导入行移动到文件顶部,作为开始。另外看看使用[savefig](http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefig)而不是print_png。 savefig只适用于一个图形,而pring_png在你的画布上工作,看起来它正在被回收并且没有正确清除。 – jozzas

回答

1

从settings.py的matplotlib进口线移至每个图表模块的顶部以及使用savefig(所建议的jozzas - 感谢)似乎已经解决干扰问题:

这样做通过去除:

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
canvas=FigureCanvas(fig1) 
canvas.print_png(response) 

然后,我添加代替:

fig1.savefig(response, format='png') 

更新: 主要问题是pyplot函数没有正确附加到数字实例,这已在this post讨论和解决。