kuroの覚え書き

96の個人的覚え書き

matplotlibでグラフをWeb上に表示

さて、Pythonでグラフをかけるようになったので、今度はそれをFlaskでweb上に表示させてみたい。
まえに参照したページはpython2系のコードだったようで、そのままではPython3ではエラーが出る。
なので、エラーを一つずつ潰していったところ

@app.route('/')
def index():
    import matplotlib.pyplot
    from matplotlib.backends.backend_agg import FigureCanvasAgg
    import io
    import random

    fig, ax = matplotlib.pyplot.subplots()
    ax.set_title(u'Random')
    x_ax = range(1, 256)
    y_ax = [random.randint(1, 1024) for x in x_ax]
    ax.plot(x_ax, y_ax)

    canvas = FigureCanvasAgg(fig)
    buf = io.BytesIO()
    canvas.print_png(buf)
    data = buf.getvalue()

    response = make_response(data)
    response.headers['Content-Type'] = 'image/png'
    response.headers['Content-Length'] = len(data)
    return response

あとfrom Flask import make_responseもプログラムの先頭あたりで加えておく。

Python2版からの変更点は
cStringIOをimportしていたところをioをimportに変え、
buf = cStringIO.StringIO()
だったところを
buf = io.BytesIO()
に変えた。
これにより、アプリケーションルートにアクセスすれば

こんな感じに表示されることを確認。

さて、次はSQLのデータをグラフに表示することを目指す。

@app.route('/')
def index():
    import matplotlib.pyplot
    from matplotlib.backends.backend_agg import FigureCanvasAgg
    import io
    import random

    session = Session()
    y = session.query(Diff).filter(Diff.id == 10).one()
    fig, ax = matplotlib.pyplot.subplots()
    ax.set_title(u'test')
    # x_ax = range(1, 256)
    x_ax = ["cont4", "cont5", "cont6", "sample7", "sample8", "sample9"]
    # y_ax = [random.randint(1, 1024) for x in x_ax]
    y_ax = [y.Nb_cont04, y.Nb_cont05, y.Nb_cont06, y.Nb_samp07, y.Nb_samp08, y.Nb_samp09]
    ax.plot(x_ax, y_ax)

    canvas = FigureCanvasAgg(fig)
    buf = io.BytesIO()
    canvas.print_png(buf)
    data = buf.getvalue()

    response = make_response(data)
    response.headers['Content-Type'] = 'image/png'
    response.headers['Content-Length'] = len(data)
    return response

こんな感じでテーブルdiffからクエリを読み込んでグラフ化できた。

ここまでくれば後はWTFormから検索条件を読んで、それをグラフ化できるようにすれば、なんとなくデータ解析アプリになるな。