如何在Django网页中嵌入matplotlib图?

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)

我现在得到的是什么:

当前页面

Dee*_*ini 6

我知道这个问题被标记为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)


Dan*_* B. 5

我搜索了很多,直到我找到一个解决方案,当我在 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)


Jan*_*nek 4

我认为你应该取消注释这一行:

#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)