web-dev-qa-db-ja.com

Python:flaskでmatplotlibを表示する方法

私は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 }} alt="Chart" height="42" width="42">

   </body>
</html>
10
SVill

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" alt="my plot">
29
Messa

@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}} alt="Chart" height="42" width="42">
3
Ajax1234