ファセットグリッドでカテゴリ別に小さな複数図を並べる

中級

6.7.28

ファセットグリッドでカテゴリ別に小さな複数図を並べる

最終更新 2026-03-06 読了時間 2 分
まとめ
  • カテゴリ変数でデータを分割し、同じチャートを格子状に並べて条件ごとの違いを比較する。
  • seaborn の FacetGridrelplot / catplot で行×列のグリッドを自動生成できる。
  • 「重ねると読みにくいが、分けると比較しやすい」場面で Small Multiples パターンとして広く使われる。

ファセットグリッド(Small Multiples)は、同一のチャートをカテゴリで分割して並べるパターン。Edward Tufte が提唱した原則で、色の区別に頼らず条件間の比較が可能になる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

rng = np.random.default_rng(42)
regions = ["北海道", "関東", "関西", "九州"]
months = pd.date_range("2024-01", periods=12, freq="MS").strftime("%m月").tolist()

rows = []
for region in regions:
    base = rng.uniform(80, 150)
    seasonal = np.sin(np.linspace(0, 2 * np.pi, 12)) * rng.uniform(15, 40)
    sales = base + seasonal + rng.normal(0, 8, 12)
    for m, s in zip(months, sales):
        rows.append({"地域": region, "月": m, "売上": round(s, 1)})

df = pd.DataFrame(rows)
df["月番号"] = df["月"].str.replace("月", "").astype(int)
df = df.sort_values("月番号")

g = sns.FacetGrid(df, col="地域", col_wrap=2, height=3, aspect=1.4, sharey=True)
g.map_dataframe(sns.lineplot, x="月", y="売上", marker="o", color="#2563eb")
g.set_titles("{col_name}")
g.set_xlabels("月")
g.set_ylabels("売上(万円)")

for ax in g.axes.flat:
    ax.grid(axis="y", alpha=0.2)
    ax.tick_params(axis="x", rotation=45)

g.figure.suptitle("地域別 月次売上推移(ファセットグリッド)", y=1.02, fontsize=13)
g.tight_layout()

plt.show()

地域別月次売上推移のファセットグリッド

読み方のポイント #

  • 各パネルの形状を横断的に比較する。季節性のピークやトレンドの違いがパネル間で際立つ。
  • Y 軸を共有(sharey=True)しているため、パネル間のスケール比較が正確にできる。
  • 色は統一し、パネルのタイトルで条件を示すのが Small Multiples の基本原則。

いつ使うか #

  • 適している場面: カテゴリが 4〜12 程度で、重ねると線やバーが混雑するとき。時系列・散布図・ヒストグラムなど任意のチャートに適用できる。
  • 不向きな場面: カテゴリが 20 以上あるとパネルが多すぎて一覧性が落ちる。2 カテゴリだけなら重ねて描いた方がコンパクト。
  • 代替手段: カテゴリが多い場合はハイライト+グレーアウトで 1 枚に収める手法。対話的に絞り込むなら Plotly の facet_col

よくある失敗パターン #

  • Y 軸スケールの不統一: sharey=False のままだと、各パネルのスケールが異なり誤った比較を招く。比較目的なら必ず sharey=True(または sharex=True)にする。
  • パネルタイトルの欠落: タイトルがないとどのパネルがどのカテゴリか判別できない。set_titles("{col_name}") を忘れずに設定する。