さて、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から検索条件を読んで、それをグラフ化できるようにすれば、なんとなくデータ解析アプリになるな。