Matplotlib の agg バックエンドを使った画像生成

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Python の Matplotlib で直接 agg バックエンドを使用して画像を作成するプロセスを案内します。agg バックエンドは、pyplot インターフェイスを使用せずにコードを完全に制御したい Web アプリケーション開発者に役立ちます。この実験では、agg キャンバスの内容をファイルに保存する方法と、それを numpy 配列に抽出する方法を示します。この numpy 配列は、次に Pillow に渡すことができます。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使用して練習します。

場合によっては、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

グラフとキャンバスを作成する

まず、グラフとキャンバスを作成する必要があります。グラフはプロットのサイズ、形状、内容を定義します。一方、キャンバスはグラフが描画される場所です。

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure

fig = Figure(figsize=(5, 4), dpi=100)
canvas = FigureCanvasAgg(fig)

グラフにプロットデータを追加する

グラフとキャンバスができたので、グラフにいくつかのデータを追加できます。この例では、単純な折れ線グラフを追加します。

ax = fig.add_subplot()
ax.plot([1, 2, 3])

グラフをファイルに保存する

グラフを保存するには 2 つのオプションがあります。最初のオプションは、グラフをファイルに保存することです。この例では、グラフを PNG 画像として保存します。

fig.savefig("test.png")

レンダラーバッファを numpy 配列に抽出する

グラフを保存する 2 番目のオプションは、レンダラーバッファを numpy 配列に抽出することです。これにより、cgi スクリプト内で Matplotlib を使用して、グラフをディスクに書き込む必要なく済みます。この例では、レンダラーバッファを抽出して numpy 配列に変換します。

import numpy as np

canvas.draw()
rgba = np.asarray(canvas.buffer_rgba())

numpy 配列を Pillow 画像に保存する

numpy 配列ができたので、それを Pillow に渡して、Pillow がサポートする任意の形式で保存することができます。この例では、グラフを BMP 画像として保存します。

from PIL import Image

im = Image.fromarray(rgba)
im.save("test.bmp")

まとめ

この実験では、Python の Matplotlib における agg バックエンドを使って画像を作成する方法を紹介しました。グラフとキャンバスを作成し、グラフにデータを追加して、PNG 画像として保存しました。また、レンダラーバッファを numpy 配列に抽出し、Pillow を使って BMP 画像として保存しました。これらの技術は、グラフの管理やグラフのクローズなどの pyplot インターフェイスを使わずに、コードを完全にコントロールしたい Web アプリケーション開発者にとって役立ちます。