rig*_*tre 5 python django graph matplotlib
所以,请耐心等待,因为我对Django,Python和Web开发非常陌生.我想要做的是显示我使用matplotlib制作的图表.我让它工作到主页自动重定向到图形的png(基本上是浏览器中显示图形的选项卡).但是,现在我想要的是看到实际的主页与图形简单嵌入.换句话说,我想看到导航栏等,然后是网站正文中的图形.
到目前为止,我已经搜索过,而且我对如何实现这一目标有所了解.我在想的是有一个只返回图形的特殊视图.然后,以某种方式从我的模板中的img src标签访问此png图像,我将用它来显示我的数据.
图形代码:
from django.shortcuts import render
import urllib
import json
from django.http import HttpResponse
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import datetime as dt
import pdb
def index(request):
stock_price_url = 'https://www.quandl.com/api/v3/datatables/WIKI/PRICES.json?ticker=GOOGL&date.gte=20151101&qopts.columns=date,close&api_key=KEY'
date = []
price = []
#pdb.set_trace()
source_code = urllib.request.urlopen(stock_price_url).read().decode()
json_root = json.loads(source_code)
json_datatable = json_root["datatable"]
json_data = json_datatable["data"]
for day in json_data:
date.append(dt.datetime.strptime(day[0], '%Y-%m-%d'))
price.append(day[1])
fig=Figure()
ax = fig.add_subplot(1,1,1)
ax.plot(date, price, '-')
ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title("Google Stock")
canvas = FigureCanvas(fig)
response = HttpResponse(content_type='image/png')
#canvas.print_png(response)
return response
Run Code Online (Sandbox Code Playgroud)
模板代码:
{% extends "home/header.html" %}
{% block content %}
<p>Search a stock to begin!</p>
<img src="home/graph.py" />
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我现在得到的是什么:
我知道这个问题被标记为matplotlib,但我需要做同样的事情,而且我发现plotly更加易于使用和吸引人。您可以简单地绘制图形,然后在视图中获取图形的html代码,如下所示:
# fig is plotly figure object and graph_div the html code for displaying the graph
graph_div = plotly.offline.plot(fig, auto_open = False, output_type="div")
# pass the div to the template
Run Code Online (Sandbox Code Playgroud)
在模板中执行以下操作:
<div style="width:1000;height:100">
{{ graph_div|safe }}
</div>
Run Code Online (Sandbox Code Playgroud)
我搜索了很多,直到我找到一个解决方案,当我在 Django 页面上渲染 matplotlib 图像时,它对我有用。通常,只是打印一个很长的字符串,而不是生成可视化。所以,最终对我有用的是以下内容:
一、进口:
import matplotlib.pyplot as plt
from io import StringIO
import numpy as np
Run Code Online (Sandbox Code Playgroud)
返回图形的虚拟函数如下:
def return_graph():
x = np.arange(0,np.pi*3,.1)
y = np.sin(x)
fig = plt.figure()
plt.plot(x,y)
imgdata = StringIO()
fig.savefig(imgdata, format='svg')
imgdata.seek(0)
data = imgdata.getvalue()
return data
Run Code Online (Sandbox Code Playgroud)
这个可以被其他函数调用,使用和渲染返回的图像return_graph():
def home(request):
context['graph'] = return_graph()
return render(request, 'x/dashboard.html', context)
Run Code Online (Sandbox Code Playgroud)
在dashboard.html文件中,图形由以下命令嵌入:
{{ graph|safe }}
Run Code Online (Sandbox Code Playgroud)
我认为你应该取消注释这一行:
#canvas.print_png(response)
Run Code Online (Sandbox Code Playgroud)
您可以使用 django HttpResponse 轻松返回绘图,而不是使用一些额外的库。在 matplotlib 中,有一个FigureCanvasAgg,它使您可以访问渲染绘图的画布。最后,您可以简单地将其作为 HttpResonse 返回。这里有非常基本的例子。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_agg import FigureCanvasAgg
from django.http import HttpResponse
def plot(request):
# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
response = HttpResponse(content_type = 'image/png')
canvas = FigureCanvasAgg(fig)
canvas.print_png(response)
return response
Run Code Online (Sandbox Code Playgroud)