Python講座 / Matplotlibで集計結果をグラフにする

Matplotlibではデータ、座標、ラベルを指定してグラフを作ります。比較したい内容と単位を先に決め、実行環境に合わせて画面表示か画像保存を選びます。

図より先に比較する内容を決める

分類別の合計は横軸に分類、縦軸に金額を置く棒グラフで比較できます。時系列なら日付順のデータが必要です。グラフで誤った集計は修正できないため、値、単位、不足データを先に確認します。

仮想環境へ導入します。

python -m pip install matplotlib

この例は元の分類food・transportを食費・交通費と表示します。候補から日本語対応のインストール済みフォントを選び、なければ案内エラーで停止します。先に導入状況と利用条件を確認し、必要ならfont_choicesを実在するフォント名に替えてください。

グラフ全体を作って保存する

保存時にexpense-chart.pngを置き換えるため、新しい出力フォルダーを使います。chart.pyを保存し、python chart.pyを実行します。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 18, "axes.titlesize": 22, "axes.labelsize": 20, "xtick.labelsize": 18, "ytick.labelsize": 18})
from matplotlib import font_manager
font_choices = ['Yu Gothic', 'Meiryo', 'Hiragino Sans', 'Noto Sans CJK JP']
available = {font.name for font in font_manager.fontManager.ttflist}
font_name = next((name for name in font_choices if name in available), None)
if font_name is None:
    raise RuntimeError("Install a font supporting the chart labels and restart Python")
plt.rcParams["font.family"] = font_name
plt.rcParams["axes.unicode_minus"] = False

categories = ["food", "transport"]
amounts = [11500, 2500]
fig, ax = plt.subplots(figsize=(7, 4), layout="constrained")
bars = ax.bar(categories, amounts, color=["#2b6cb0", "#d69e2e"])
ax.set_ylabel("金額(KRW)")
ax.set_title("分類別の支出")
ax.set_xticks(range(len(categories)), ['食費', '交通費'])
ax.set_ylim(0, max(amounts) * 1.2)
ax.bar_label(bars, fmt="%.0f", padding=3)
fig.savefig("expense-chart.png", dpi=160)
plt.close(fig)
print("saved expense-chart.png")

予想するメッセージです。

saved expense-chart.png

Figure・Axes・バックエンドを区別する

Figureは図全体、Axesは座標とデータを描く領域です。figとaxを明示しておくと、複数の図があっても、どの図を変更する操作か分かりやすくなります。

AggはGUIを使わずファイルを出力するため、自動レポートにも使えます。デスクトップのウィンドウへ表示するならAggの選択を外し、保存後にplt.show()を呼びます。その場合はGUIのバックエンドが必要です。繰り返し生成するときは図を閉じて資源を解放します。

保存した画像を直接確認する

expense-chart.pngを開き、11500と2500の二つの棒、KRWの単位、0から始まる縦軸を確認します。図の幅を一時的に小さくし、ラベルの重なりや欠けを観察して元へ戻します。

履歴を保つなら日付や実行単位の新しいファイル名を使います。軸の切り詰めや面積の誇張で差を大きく見せないようにします。描画前の値の確認には、pandasによる集計のように検証済みの合計を使う流れが役立ちます。

関連する公式リファレンス

下のグラフは上のコードを実際に実行して保存した結果です。同じ0基準の軸でfood 11,500とtransport 2,500を比較します。日本語や韓国語のラベルには対応するインストール済みフォントを指定します。下の設定は実在するファイルのパスに替え、グラフ作成前に適用してください。フォント変更でデータや棒の高さは変わりません。

食費11,500 KRWと交通費2,500 KRWを比較する棒グラフ

font_pathをインストール済みフォントの実在パスにします。Windowsの例は游ゴシックです。macOS・Linuxでは日本語フォントの実在パスに替えます。

from matplotlib import font_manager
font_path = "C:/Windows/Fonts/YuGothR.ttc"
font_manager.fontManager.addfont(font_path)
plt.rcParams["font.family"] = font_manager.FontProperties(fname=font_path).get_name()
plt.rcParams["axes.unicode_minus"] = False

設定はpyplotをpltとしてimportした後、figを作る前に置きます。ラベルもax.set_title("分類別の支出")などへ替え、保存画像に文字欠けがないか確認します。

動作と適用条件の公式説明:Matplotlib: FontProperties