06.7.28
ファセットグリッドでカテゴリ別に小さな複数図を並べる
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 を適用します。
| |

実行結果の読み方 #
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}") を忘れると、どのパネルがどの地域か読者が判別できないので、必ず設定してください。
- 複数ラインの推移比較 — 1 枚に重ねる方式
- スパークラインパネル — よりコンパクトなミニチャート群
- リッジラインプロット — 分布を段状に並べる