Python:如何在烧瓶中显示 matplotlib [重复]

Posted

技术标签:

【中文标题】Python:如何在烧瓶中显示 matplotlib [重复]【英文标题】:Python: How to show matplotlib in flask [duplicate] 【发布时间】:2018-11-16 14:34:41 【问题描述】:

我对 Flask 和 Matplotlib 很陌生。我希望能够显示我在一些 html 中生成的简单图表,但我很难弄清楚如何。这是我的 Python 代码:

from flask import Flask, render_template
import numpy as np
import pandas
import matplotlib.pyplot as plt

app = Flask(__name__)
variables = pandas.read_csv('C:\\path\\to\\variable.csv')
price =variables['price']


@app.route('/test')
def chartTest():
    lnprice=np.log(price)
    plt.plot(lnprice)
    return render_template('untitled1.html', name = plt.show())

if __name__ == '__main__':
   app.run(debug = True)

这是我的 HTML:

<!doctype html>
<html>
   <body>

      <h1>Price Chart</h1>

      <p> name </p>

      <img src= name    >

   </body>
</html>

【问题讨论】:

不幸的是,它并不能简单地以这种方式工作,您需要先将绘图保存为图像/矢量(保存到磁盘或存储在内存中),以便可以在浏览器中加载。这涉及到更多的事情,但您可以先在此处查看如何保存它***.com/a/29931148/9802392,然后在此处查看如何从 Flask 提供它***.com/questions/20646822/… 谢谢,我会好好读一读的。 如果您遇到困难,请在此处评论,理想情况下显示您在问题中尝试的一些进展,从 Flask 提供文件有多种解决方案,并且是您的 html 可以显示/到达该文件的先决条件。您的 html 不一定完全错误,您不能只将 Python 对象传递给视图,因此您传递的 name 应该是一个 URL。你也希望它在 "" 中。希望你成功。 【参考方案1】:

您可以在 Flask URL 路由处理程序中即时生成图像:

import io
import random
from flask import Response
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

@app.route('/plot.png')
def plot_png():
    fig = create_figure()
    output = io.BytesIO()
    FigureCanvas(fig).print_png(output)
    return Response(output.getvalue(), mimetype='image/png')

def create_figure():
    fig = Figure()
    axis = fig.add_subplot(1, 1, 1)
    xs = range(100)
    ys = [random.randint(1, 50) for x in xs]
    axis.plot(xs, ys)
    return fig

然后你需要在你的 HTML 模板中包含图片:

<img src="/plot.png" >

【讨论】:

由于浏览器缓存,这不会可靠地显示变化的动态绘图内容。对于在重新加载时不会改变的静态图,这很好 您可以(并且应该,如果数据是动态的)添加适当的 http 标头以禁用缓存。最终,如果您需要“实时”数据,您应该选择不同的方法——通过 websocket 将数据提供给浏览器并使用 javascript(d3.js 或类似的)绘制它们。 我正在尝试调整 plot_png() 以接收参数 xs, ys 但有一个 TypeError: plot_png() missing 2 required positional arguments: 'xs' and 'ys'。我只是在main() 中粘贴了相同的随机生成样本,而不是在create_figure() 中。怎么了? 可以使用多线程从 uwsgi 调用烧瓶应用程序。以上matplotlib的使用是线程安全的吗? @KrisStern 这最初对我也不起作用,使用的是flask 2.0.1。但是我将第 5 行从 from matplotlib.figure import Figure 更改为 from matplotlib import pyplot as plt。之后,我删除了plot_png 的第一行并将返回之前的行更改为FigureCanvas(plt.gcf()).print_png(output)。像梦一样工作。【参考方案2】:

正如@d parolin 所指出的,matplotlib 生成的图形在被 HTML 呈现之前需要保存。为了通过 HTML 提供 flask 中的图像,您需要将图像存储在您的 flask 文件目录中:

static/
  images/
    plot.png --> store plots here
templates/

因此,在您的应用程序中,使用plt.savefig:

@app.route('/test')
def chartTest():
  lnprice=np.log(price)
  plt.plot(lnprice)   
  plt.savefig('/static/images/new_plot.png')
  return render_template('untitled1.html', name = 'new_plot', url ='/static/images/new_plot.png')

然后在untitled1.html:

  <p> name </p>

  <img src= url   >

【讨论】:

不需要保存图片。为了在 HTML 中显示它,您可以将数据直接放入 img 标签的 src 参数中。 @MaciekS 这听起来是个好主意。请显示一个代码示例。 @mac13k 代码很难放在这里,所以我分享为GitLab snippet。 如果有人阅读这篇文章得到NSInternalInconsistencyException,请避免使用 Matplotlib GUI。这是通过导入 Agg 来完成的 - 请参阅此答案:***.com/a/15713545/13055097

以上是关于Python:如何在烧瓶中显示 matplotlib [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python Matplot中文显示完美解决方案

Python Matplot中文显示完美解决方案

Python Matplot中文显示完美解决方案

Python Matplot中文显示完美解决方案

烧瓶-PyMongo。如何显示从 python 到 html 的所有条目?

如何在python烧瓶中获取具有本地时区的模板文件的修改日期