我有一个嵌入了多个Matplotlib数字的页面。这些数字通过Ajax插入/操作如下(带有时间戳以便浏览器重新加载):
<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后,问题又回来了。这些数字相互干扰,或者根本没有绘制图形的某些部分?关于问题可能在哪里的任何想法?
编辑:两个地块的示例合二为一。顶部的线条属于另一个图形,缺少它们。我还要提一下,这绝不是本地运行开发服务器的问题!
答案 0 :(得分: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中进行了讨论和解决。