Я пытаюсь разместить на странице несколько графиков, созданных с помощью 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>
А вот отображаемая страница
При изменении параметра para в test_graph () на 3,4, который отсутствует в параметре url, на веб-странице был показан исключительный график (graph3), который, кажется, работает хорошо
Пожалуйста, дайте мне несколько советов или решение
PS. Включает ли следующее сообщение? ВНИМАНИЕ: области перетаскивания NSWindow должны быть недействительными только в главном потоке! Это приведет к исключению в будущем
Править Я мог бы решить сообщение WARING, добавив "matplotlib.use ('Agg')"
Изменение функции test_graph IAW ger.s.brett advice и исключение функции графика
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 Добавьте выходные графики, каждый раз обращаясь к веб-странице
Я получил ответ и ниже приведен пересмотренный код
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>
Итак ... это было так просто