Django: Как разместить каждый график на странице, не сохраняя его - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь разместить на странице несколько графиков, созданных с помощью 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 При изменении параметра 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 Добавьте выходные графики, каждый раз обращаясь к веб-странице 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 голосов
/ 10 марта 2020

Если вы хотите использовать matplotlib с django, используйте sonething наподобие django -matplotlib.

Использование объекта plt является хорошей идеей, если вы используете python Interactive.

...