アプリ

【matplotlib,python】matplotlibをwebアプリに表示

matplotlibは、様々なグラフを簡単に作れる一方で、webアプリにはそのまま表示できません。

今回は、Flaskでmatplotlibを表示させたい思います。

サンプルコード

このコードは、そのままコピペで使用できます。

このコードの一部は、以下のサイトから引用しています。

https://teratail.com/questions/319114

from flask import Flask, render_template
from io import BytesIO
import io
import base64
import matplotlib.pyplot as plt
import numpy as np

app = Flask(__name__)

# -----figをbase64形式に変換を関数化------
def fig_to_base64_img(fig):
    io = BytesIO()
    fig.savefig(io, format="png")
    io.seek(0)
    base64_img = base64.b64encode(io.read()).decode()

    return base64_img

# -----flaskのルーティング--------
@app.route('/sample')
def sample():
    fig = plt.figure()

  # -----以下の点線内は自由に変更可能-------
  x = np.linspace(0, 10, 100)
  y = x + np.random.randn(100) 
   plt.plot(x, y, label="test")
   # --------------------------------------
   img = fig_to_base64_img(fig)
   
   return render_template('sample.html',img=img)

受ける側のhtmlは、以下のような感じです。base.htmlは省略します。

{% extends 'base.html' %}
{% block body %}

<div style="margin-left: 150px;">
    <img src="data:image/png;base64,{{ img }}">
</div>

{% endblock %}

解説

flask.py

  • figをbase64形式に変換を関数化
  • flaskのルーティング(img付き)

〇 figをbase64形式に変換を関数化

figのままでは表示できないので、今回はbase64に変換します。

# -----figをbase64形式に変換を関数化------
def fig_to_base64_img(fig):
    io = BytesIO()
    fig.savefig(io, format="png")
    io.seek(0)
    base64_img = base64.b64encode(io.read()).decode()

    return base64_img

〇 flaskのルーティング(img付き)

matplotlibでグラフを作成し、先ほどのfig_to_base64_imgでbase64に変換します

変換したimgを変数として、return render_templateで引き渡します。

# -----flaskのルーティング--------
@app.route('/sample')
def sample():
    fig = plt.figure()

  # -----以下の点線内は自由に変更可能-------
  x = np.linspace(0, 10, 100)
  y = x + np.random.randn(100) 
   plt.plot(x, y, label="test")
   # --------------------------------------
   img = fig_to_base64_img(fig)
   
   return render_template('sample.html',img=img)

sample.html

こちらはhtmlとcssの話なので、特に解説ないです。

{% extends 'base.html' %}
{% block body %}

<div style="margin-left: 150px;">
    <img src="data:image/png;base64,{{ img }}">
</div>

{% endblock %}

おまけ

グラフの表示位置の変更等はcssで、サイズの変更や軸ラベルなどは 以下のようにmatplotlib側で変更できます。

# グラフサイズの変更
fig = plt.figure(figsize=(15,6))

# X軸、Y軸のラベル
plt.xlabel('month-day',fontsize=18)
plt.ylabel("Temperature ℃",fontsize=18)

# 軸の上限下限
plt.ylim(110,120)
plt.xlim(0,120)

# 補助線
plt.grid()

# 凡例表示
plt.legend(loc='upper left',fontsize=20)

関連記事

プログラミングの勉強に悩んだら、、

プログラミングの勉強に悩んだら、『Udemy』をオススメします。

オススメのポイント
・全ての講座がオンライン
・リーズナブルな価格で、実用的なスキル
・購入した講座を何度でも見直せる
・プログラミングの講座が豊富

プログラミング言語の人気オンラインコース 開発の人気オンラインコース

アプリ
最新情報をチェックしよう!