概要(複数グラフは「比較」と「文脈」を一枚で伝えるための基本スキル)
複数グラフの描画は、指標の関係や推移を“並べて”見せることで理解を一気に深めます。pandasとmatplotlibを使えば、サブプロット(上下・左右の分割)、共有軸(sharex/sharey)、凡例やレイアウト調整まで短いコードで整理できます。重要なのは「何を同じ軸で比較するか」「スケールをどう揃えるか」「見やすい配置と余白」に集約されます。
基本の作り方(plt.subplotsでキャンバスを分割する)
最小例(上下に2つのグラフを配置)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
"date": pd.date_range("2025-01-01", periods=8, freq="D"),
"sales": [100, 120, 90, 140, 110, 130, 115, 150],
"users": [50, 55, 53, 60, 58, 62, 61, 64]
}).set_index("date")
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
df["sales"].plot(ax=ax1, color="#4e79a7", label="Sales")
ax1.set_title("Daily sales"); ax1.grid(True, alpha=0.3); ax1.legend()
df["users"].plot(ax=ax2, color="#f28e2c", label="Users")
ax2.set_title("Daily users"); ax2.grid(True, alpha=0.3); ax2.legend()
plt.tight_layout()
plt.show()
Pythonsharex=Trueで同じ時間軸を共有するため、拡大・縮小や読み取りが一貫します。タイトル・グリッド・凡例は各軸で設定します。
横並びの比較(同スケールで見せたいとき)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4), sharey=True)
df["sales"].plot(ax=ax1, kind="bar", color="#4e79a7", alpha=0.7, label="Sales")
ax1.set_title("Sales"); ax1.grid(True, axis="y", alpha=0.3); ax1.legend()
df["users"].plot(ax=ax2, kind="bar", color="#f28e2c", alpha=0.7, label="Users")
ax2.set_title("Users"); ax2.grid(True, axis="y", alpha=0.3); ax2.legend()
plt.tight_layout()
plt.show()
Pythonsharey=Trueで縦軸を揃えると、量の比較が直感的になります。
pandasで手短に複数列を分割表示(subplots=True/レイアウト指定)
列ごとに自動でサブプロット化
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
"A": [1, 3, 2, 4, 5],
"B": [10, 8, 7, 6, 9],
"C": [100, 120, 90, 140, 110]
}, index=pd.date_range("2025-01-01", periods=5))
axes = df.plot(subplots=True, figsize=(8, 6), grid=True, legend=False)
plt.tight_layout()
plt.show()
Pythonsubplots=Trueだけで、各列が別軸に並びます。簡単なダッシュボードに便利です。
グリッド配置(行×列の見やすい並べ方)
axes = df.plot(subplots=True, layout=(2, 2), figsize=(9, 6), grid=True, legend=False)
Pythonlayout=(rows, cols)で行列配置を指定できます。未使用のマスは空になります。
二軸や複合形をサブプロットで安全に扱う(secondary_y/twinx)
サブプロット内で二軸を使い分ける
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
df["sales"].plot(ax=ax1, kind="bar", color="#4e79a7", alpha=0.6, label="Sales")
ax1.set_ylabel("Sales")
ax1.grid(True, axis="y", alpha=0.3)
ax1.legend()
ax2b = ax2.twinx()
df["users"].plot(ax=ax2, color="#59a14f", label="Users")
(df["sales"] / 100).plot(ax=ax2b, color="#e15759", label="Sales (scaled)")
lines = ax2.get_lines() + ax2b.get_lines()
labels = [l.get_label() for l in lines]
ax2.legend(lines, labels, loc="upper left")
plt.tight_layout()
plt.show()
Python単位が違う系列はtwinxで右軸を追加します。凡例は両軸のラインをまとめて統合します。
実践パターン(月次ダッシュボード、比較・残差、グループ別の面)
月次ダッシュボード(棒+折れ線/KPIを上下に)
monthly = df.resample("M").sum()
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(9, 6), sharex=True)
monthly["sales"].plot(ax=ax1, kind="bar", color="#4e79a7", alpha=0.6, label="Monthly sales")
monthly["users"].plot(ax=ax1, color="#f28e2c", linewidth=2, marker="o", label="Monthly users")
ax1.set_title("Monthly KPI"); ax1.grid(True, axis="y", alpha=0.3); ax1.legend()
ma = monthly["sales"].rolling(3, min_periods=2).mean()
resid = monthly["sales"] - ma
ma.plot(ax=ax2, color="#59a14f", linewidth=2, label="3M MA")
resid.plot(ax=ax2, color="#e15759", label="Residual")
ax2.set_title("Trend and residual"); ax2.grid(True, alpha=0.3); ax2.legend()
plt.tight_layout()
plt.show()
Python上段で量と推移、下段でトレンドと残差を分けると“何が起きているか”が明瞭になります。
グループ別に面を分ける(店舗やカテゴリごとの比較)
import numpy as np
stores = ["A", "B", "C"]
data = pd.DataFrame({
"date": pd.date_range("2025-01-01", periods=12, freq="M"),
"store": np.random.choice(stores, 12),
"sales": np.random.randint(80, 160, 12)
})
fig, axes = plt.subplots(len(stores), 1, figsize=(8, 8), sharex=True)
for i, st in enumerate(stores):
sub = data[data["store"] == st].set_index("date").sort_index()
sub["sales"].plot(ax=axes[i], marker="o", label=f"Store {st}", color=["#4e79a7","#e15759","#59a14f"][i])
axes[i].set_title(f"Store {st}"); axes[i].grid(True, alpha=0.3); axes[i].legend()
plt.tight_layout()
plt.show()
Python面を分けると、群ごとのパターン差がはっきり見えます。sharex=Trueで時間軸を共有します。
重要ポイントの深掘り(共有軸・スケールの一貫性・レイアウトの仕上げ)
共有軸で“比較可能な土台”を作る
比較が主目的なら、sharex/shareyを積極的に使って軸を共通化します。縦軸を揃えると量の比較、横軸を揃えるとタイミング比較が直感的になります。
スケールの一貫性と凡例の明確化
桁が違う系列は二軸かスケール調整(正規化・標準化)で同軸に載せます。凡例は短いラベル・重複色回避・必要なら注釈で“何を示す線か”を明確にします。
余白・サイズ・グリッドで読みやすさを仕上げる
plt.tight_layout()やconstrained_layout=Trueで重なりを解消し、figsizeで比率を調整。薄いyグリッドを入れると値の読み取りが速くなります。軸ラベルには単位を含めて誤読を防ぎます。
保存・再利用を前提に整える
同じスタイルを再現したい場合は、色やフォントを固定(rcParams)、描画関数にまとめて使い回します。出力はplt.savefig(“dashboard.png”, dpi=200)やPDF/SVGで高解像度化します。
まとめ(「subplotsで分ける→共有軸で比較→二軸・正規化で桁差を処理」。仕上げで誤読ゼロへ)
複数グラフは、情報を“分けて並べる”ことで比較と理解を加速します。まずplt.subplotsやsubplots=Trueで面を作り、sharex/shareyで比較可能な土台を用意。桁や単位が違う系列は二軸か正規化で安全に重ね、レイアウト調整と凡例・グリッドで仕上げる。この型を守れば、初心者でも見やすく説得力のある複数グラフを安定して作れます。
