Python
 Computer >> コンピューター >  >> プログラミング >> Python

FlaskでMatplotlibのグラフを表示する方法【サンプルコード付き】

Webアプリケーション上でグラフを動的に表示したい場合、FlaskMatplotlibを組み合わせるのが効果的です。この記事では、Flaskアプリケーション内でMatplotlibのプロットをPNG画像としてブラウザに返す方法を、具体的な手順とサンプルコードとともにわかりやすく解説します。

実装の流れ

FlaskでMatplotlibのグラフを表示するまでの基本的な手順は以下の通りです。

  • 小さなFlaskアプリケーションを作成する
  • カレントディレクトリに移動し、環境変数を設定してアプリを起動する
    $ export FLASK_APP=file.py
    $ flask run
  • ブラウザで https://127.0.0.1:5000/print-plot/ にアクセスする
  • 乱数(random)を使ってx軸・y軸用のデータポイントを生成する
  • 作成した軸(axes)に対してデータポイントをプロットする
  • 図をPNG形式でメモリ上に書き出す
  • BytesIOオブジェクトから全内容を取得し、レスポンスとして返す

サンプルコード

import io
import numpy as np
import matplotlib.pyplot as plt
from flask import Flask, Response
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

app = Flask(__name__)

@app.route('/print-plot')
def plot_png():
    fig = Figure()
    axis = fig.add_subplot(1, 1, 1)
    xs = np.random.rand(100)
    ys = np.random.rand(100)
    axis.plot(xs, ys)
    output = io.BytesIO()
    FigureCanvas(fig).print_png(output)
    return Response(output.getvalue(), mimetype='image/png')

コードのポイント

  • FigureCanvasAggは描画バックエンドとして機能し、画面表示なしで図をメモリ上のPNG画像にレンダリングできます。サーバー環境では必須のアプローチです。
  • io.BytesIOを使うことで、一時ファイルを作成せずに画像データをインメモリで扱えます。
  • print_png(output)でBytesIOオブジェクトにPNGデータを書き込み、getvalue()でバイナリデータを取り出します。
  • 最後にmimetype='image/png'を指定したResponseとして返すことで、ブラウザが画像として正しく認識します。

実行結果

サーバーを起動してブラウザでURLにアクセスすると、ランダムに生成された100個のデータポイントからなる折れ線グラフがPNG画像として表示されます。

FlaskでMatplotlibのグラフを表示する方法【サンプルコード付き】

この手法を応用すれば、ユーザーの入力やデータベースの値に基づいて、動的に変化するグラフをWebページ上に提供することも可能になります。ダッシュボードやレポート機能の実装など、さまざまな場面で活用してみてください。

  1. Matplotlibで3D連続線をプロットする方法

    Matplotlibを使って3次元空間に連続的な線(3Dライン)を描画する方法を解説します。基本的な手順は以下の通りです。3Dプロットの手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。NumPyを使用して x と y のデータポイントを作成します。xとyのデータポイントから z のデータポイントを計算して作成します。figure() メソッドを使って、新しい図を作成するか既存の図をアクティブにします。add_subplot() メソッドに3D投影(projection=3d)を指定して、Axesを追加します。plot() メソッドを使って、x、y、zのデータポ

  2. Matplotlibで凡例要素を水平方向に並べて表示する方法

    Matplotlibでは、legend()メソッドのncol引数を指定することで、凡例の要素を水平方向に並べて表示できます。ここでは、その具体的な手順とサンプルコードを紹介します。 手順 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。 plot()メソッドを使って、line1、line2、line3というラベル付きの折れ線グラフを描画します。 legend()メソッドで図に凡例を配置します。このとき、引数ncolにラベルの数を指定すると、凡例がその列数で水平に並びます。 show()メソッドで図を表示します。 コード例 from matplotlib imp