K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

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

中級

06.7.28

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

最終更新 2026-03-06 読了時間 2 分
まとめ
ファセットグリッド(Small Multiples)は、カテゴリ変数でデータを分割し、同じ種類のチャートを格子状に並べて条件ごとの違いを比べる手法です。1 枚に 4 本の折れ線を重ねると色で系列を追う負担がかかりますが、地域ごとに 1 パネルずつ分けて Y 軸を共有すれば、形の違いだけを見比べられます。seaborn の FacetGrid(df, col="地域", col_wrap=2, sharey=True) がパネルの枠を作り、map_dataframe(sns.lineplot, ...) が各パネルに同じ描画関数を適用します。読み終えると、北海道・関東・関西・九州の季節パターンの違いを 4 枚のパネルから読み取り、長い形式(long format)の DataFrame さえあれば 3 行で同じ図を作れるようになります。

直感 #

4 つの地域の月次売上を 1 枚の折れ線グラフに重ねると、線が交差して「関西だけ夏に落ち込む」という特徴を見つけるのに色の凡例と線を何度も往復することになります。Edward Tufte が Small Multiples と呼んだ方法は、同じ軸・同じ縮尺のグラフを地域ごとに 1 枚ずつ作って並べることです。各パネルには線が 1 本しかないので形がそのまま読め、隣のパネルと見比べれば違いが分かります。全パネルで Y 軸を共有しているからこそ、「関東の山は九州の山より高い」という比較が目で成り立ちます。

Python で描く #

次のコードは、4 地域 × 12 か月の売上を「地域・月・売上」の 1 行 1 観測の長い形式で作り、FacetGrid で地域ごとのパネルを 2 列に折り返して並べ、各パネルに sns.lineplot を適用します。

 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()

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

実行結果の読み方 #

4 枚のパネルは同じ Y 軸を共有しているので、線の高さをそのまま比べられます。山の位置(何月にピークが来るか)がパネルごとに違えば季節性の差、線全体の高さが違えば売上規模の差です。rng.uniform(80, 150) で地域ごとに基準値を変えているため、パネル間で線の高さが大きく異なり、sharey=True の効果がはっきり見えます。各パネルに線が 1 本しかないので、marker="o" の点の上下が月ごとのノイズ(rng.normal(0, 8))だと落ち着いて読めます。

使いどころと落とし穴 #

ファセットグリッドは、カテゴリが 4〜12 個あり、1 枚に重ねると線や棒が混雑するときに向いています。折れ線だけでなく散布図やヒストグラムにも同じ map_dataframe で適用できます。カテゴリが 20 を超えるとパネルが小さくなりすぎて一覧性が落ちるので、注目カテゴリだけ色を付けて他をグレーにする 1 枚のハイライト図か、Plotly の facet_col による対話的な絞り込みに切り替えます。最も多い失敗は sharey=False のまま比較することで、各パネルが別々の縮尺になり、売上規模が 2 倍違う地域が同じ高さの山に見えてしまいます。set_titles("{col_name}") を忘れると、どのパネルがどの地域か読者が判別できないので、必ず設定してください。