Django:如何在不保存的情况下将每个图形放在页面上

时间:2020-03-06 09:59:47

标签: django matplotlib graph save bytesio

我正努力将用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>

这是显示的页面

enter image description here 将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

编辑2
每次访问网页时添加输出图 enter image description here

enter image description here

enter image description here


我得到了答案,下面是修改后的代码

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>

所以...太简单了

1 个答案:

答案 0 :(得分:0)

如果要在django中使用matplotlib,请使用django-matplotlib之类的功能。

仅当您使用python交互式时,使用plt对象才是一个好主意。