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を比較します。日本語や韓国語のラベルには対応するインストール済みフォントを指定します。下の設定は実在するファイルのパスに替え、グラフ作成前に適用してください。フォント変更でデータや棒の高さは変わりません。
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





