06.7.10
ストリームグラフで構成比のうねりを見る
ax.stackplot(x, stacked, baseline="wiggle") の baseline 引数を変えるだけで、"zero"(通常の積み上げ)から "wiggle"(ストリーム)に切り替わります。読み終えると、位相を 3 時間ずつずらした 4 チャネルの波がどう重なるかを理解し、baseline を "sym" や "weighted_wiggle" に変えて自分の構成比データで試せるようになります。直感 #
Web サイトへの流入を 24 時間 × 4 チャネル(自然検索・広告・SNS・紹介)で記録し、「どの時間帯にどのチャネルが太いか」を見たいとします。通常の積み上げ面グラフは下端を 0 に固定するので、一番下のカテゴリは読みやすいが上に積まれたカテゴリは下の揺れに振り回されます。ストリームグラフは下端を固定せず、全体の中心が水平に近くなるように基準線を上下させます。すると各チャネルは自分の厚みだけで描かれた帯になり、太る時間帯と細る時間帯が川の支流のように読めます。全体の総量は上端と下端の距離で読み、wiggle の中心線が水平なら総量が安定していることになります。
Python で描く #
次のコードは、周期 12 時間の正弦波の位相を 3 時間ずつずらした 4 チャネルの系列を作り、stackplot の baseline="wiggle" で上下に揺れる積み上げとして描きます。チャネル名は凡例で示します。
| |

実行結果の読み方 #
4 色の帯の厚みがそのチャネルのセッション数で、厚くなる時間帯がそのチャネルのピークです。位相を 3 時間ずつずらしているので、4 つの帯のピークが 3 時間ごとに順番に現れ、全体として「流れの中心が入れ替わる」形になります。帯の上端と下端の距離が総量で、baseline="wiggle" によって中心が上下に揺れるため、個々の帯の値を Y 軸の目盛りから直接読むことはできません。SNS の帯が昼に厚くなっていれば、投稿の拡散タイミングと流入のずれを調べる手がかりになります。
使いどころと落とし穴 #
ストリームグラフは、音楽ジャンルの人気や流入チャネルの構成のように、5〜10 カテゴリの構成比が時間とともに入れ替わる様子を「印象として」伝えたいプレゼン向きの図です。基準線が揺れるので個別の値を正確に読む用途には向かず、定量的な比較が必要なら baseline="zero" の積み上げ面グラフか、100% 積み上げに切り替えてください。データ点が 24 点程度と少ないと帯の輪郭がカクカクするため、pd.Series.rolling(3).mean() などで平滑化した系列を渡すと滑らかな川の形になります。変動の大きいカテゴリを segments の中央に置くと全体が大きく揺れて見えるので、安定したカテゴリを中央、変動の大きいものを外側に並べると図が落ち着きます。
- 積み上げエリアチャート — 構成比の時間推移を面で表現
- 積み上げ棒グラフ — 全体量と内訳を同時に表示
- 複数ラインの推移比較 — 複数系列を同一軸で比較