我正努力将用Matplotlib创建的多个图形保存到页面上。当单个图获得成功时,又有一个图失败了。例如,当我尝试在网页中嵌入两个matplotlib图(graph1和graph2)时,显示了一个组合图。除此之外,指定的颜色也无效。为什么?我想知道的是如何在不集成的情况下显示每个图形。
以下是我的代码
Views.py
Matplotlib图转换为二进制数据并保存在内存中
每个图都连接到url参数
def graph():
#create graph and save it on memory
buff=io.BytesIO()
plt.savefig(buff, format='png')
bute_file=buff.getvalue()
buff.close
return bute_file
def test_graph(request,para):
if para==1: #graph1
accounts=[6,2,3,6]
label=['A','B','C','D']
col=['darkred','red','orange','gold']
plt.pie(accounts,labels=label,colors=col)
chart=graph()
plt.cla
response=HttpResponse(chart, content_type='image/png')
return response
elif para==2: #graph2
accounts=[3,6,9]
label=['E','F','G']
col=['blue','cyan','darkblue']
plt.pie(accounts,labels=label,colors=col)
chart=graph()
plt.cla
response=HttpResponse(chart, content_type='image/png')
return response
else: #graph3
accounts=[5,1,2]
label=['X','Y','Z']
col=['green','limegreen','yellowgreen']
plt.pie(accounts,labels=label)
chart=graph()
plt.cla
response=HttpResponse(chart, content_type='image/png')
return response
url.py
urlpatterns = [
path('test_view/',views.test_view, name='test_view'),
path('test/<int:para>',views.test_graph,name='test_graph')
]
html
<div>
<img src="{% url 'mysite:test_graph' 1 %}">
</div>
<div>
<img src="{% url 'mysite:test_graph' 2 %}">
</div>
这是显示的页面
将test_graph()中的para更改为url参数上不存在的3,4,该网页显示了异常的graph(graph3)似乎很好用
请给我一些建议或解决方案
PS。以下消息涉及吗? 警告:NSWindow拖动区域应仅在主线程上无效!将来会抛出异常
编辑
我可以通过添加“ matplotlib.use('Agg')”来解决WARING消息
修改test_graph函数IAW ger.s.brett建议并取消图形函数
def test_graph(request,para):
plt.clf()
if para==1: #graph1
..........
elif para==2: #graph2
..........
else: #graph3
.........
plt.pie(accounts,labels=label,colors=col)
buff=io.BytesIO()
plt.savefig(buff, format='png')
chart=buff.getvalue()
buff.close()
response=HttpResponse(chart, content_type='image/png')
return response
我得到了答案,下面是修改后的代码
view.py
class TestView(TemplateView):
template_name='mysite/test.html'
def test_graph(self,accounts,label,col):
plt.pie(accounts,labels=label,colors=col)
buff=io.BytesIO()
plt.savefig(buff, format='png')
buff.seek(0)
chart=b64encode(buff.getvalue()).decode('utf-8').replace("","")
plt.close()
buff.close()
return chart
def get_context_data(self,**kwargs):
context=super().get_context_data(**kwargs)
graph_1=self.test_graph([3,6,9],['E','F','G'],['blue','cyan','darkblue'])
graph_2=self.test_graph([6,2,3,6],['A','B','C','D'],['darkred','red','orange','gold'])
context['graph_1']=graph_1
context['graph_2']=graph_2
return context
test.html
<div>
<img src="data:image/png;base64,{{graph_1}}">
</div>
<div>
<img src="data:image/png;base64,{{graph_2}}">
</div>
所以...太简单了
答案 0 :(得分:0)
如果要在django中使用matplotlib,请使用django-matplotlib之类的功能。
仅当您使用python交互式时,使用plt对象才是一个好主意。