06.7.9
ホライゾンチャートでシーズン変動を圧縮表示
まとめホライゾンチャートは、時系列の「平均からの偏差」を一定幅の帯で輪切りにし、2 段目以降を 1 段目の上に重ねて塗ることで、高さを 1/3 に圧縮しながら振幅を色の濃さで残す図です。正の偏差は青系、負の偏差は赤系で、濃い色ほど基準から大きく離れていることを示します。実装の中心は、偏差を np.clip(centered - level * band, 0, band) で level 段目の分だけ切り出し、ax.fill_between で step="mid" の階段状に塗る処理を正負 × 3 段で繰り返すことです。読み終えると、48 週のセッション数の中で濃い青が並ぶ週が「平均を 40 以上上回った時期」だと読み取り、band と levels を変えたときに図がどう変わるかを自分の系列で試せるようになります。
直感
#
週次セッション数を 48 週分、普通の折れ線で描くと、1 系列あたり 3〜4 cm の高さが要ります。20 系列を並べるなら 1 メートル近い図になり、ダッシュボードには収まりません。ホライゾンチャートは、まず各値から平均を引いて「どれだけ上か下か」の偏差にし、次に偏差を幅 20 の帯で輪切りにします。0〜20 の部分は薄い青、20〜40 の部分は中くらいの青、40 以上は濃い青として、すべてを同じ高さ 20 の帯の中に折りたたんで重ね塗りします。負の側も同じ手順で赤の濃淡に畳むので、1 系列が高さ 20 の細い帯 2 本分に収まり、色の濃さを見れば折りたたむ前の振幅が分かります。
Python で描く
#
次のコードは、季節波(振幅 30、周期 12 週)と緩やかな上昇トレンドとノイズを合わせた 48 週の系列を作り、平均を引いた偏差を幅 20 × 3 段で切り分けて、正の帯を上に青、負の帯を下に赤で塗ります。
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
36
37
38
39
40
41
42
43
44
45
46
| import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 48)
baseline = 120 + 30 * np.sin(2 * np.pi * x / 12)
trend = 0.6 * x
rng = np.random.default_rng(7)
series = baseline + trend + rng.normal(0, 8, size=x.size)
centered = series - series.mean()
band = 20
levels = 3
palette_pos = ["#bae6fd", "#38bdf8", "#0ea5e9"]
palette_neg = ["#fecaca", "#f87171", "#ef4444"]
fig, ax = plt.subplots(figsize=(6.2, 3.6))
for level in range(levels):
upper = np.clip(centered - level * band, 0, band)
if np.any(upper > 0):
ax.fill_between(
x,
level * band,
level * band + upper,
color=palette_pos[level],
step="mid",
)
lower = np.clip(-centered - level * band, 0, band)
if np.any(lower > 0):
ax.fill_between(
x,
-(level * band + lower),
-level * band,
color=palette_neg[level],
step="mid",
)
ax.axhline(0, color="#475569", linewidth=1)
positions = range(0, 48, 6)
ax.set_xticks(positions, labels=[f"{idx + 1}月" for idx, _ in enumerate(positions)])
ax.set_yticks([])
ax.set_title("週次セッション数のホライゾンチャート(基準値からの偏差)")
ax.set_xlabel("週")
ax.spines[["top", "right", "left"]].set_visible(False)
fig.tight_layout()
plt.show()
|

実行結果の読み方
#
0 の線より上の青が平均を上回った週、下の赤が下回った週です。色が濃い部分ほど偏差が大きく、最も濃い青 #0ea5e9 が見える週は平均を 40 以上上回っています。周期 12 週の季節波を入れているので、青と赤が約 6 週ずつ交互に現れ、週 0.6 の上昇トレンドによって後半ほど青が濃く赤が薄くなるはずです。複数の系列を同じ band で縦に並べると、どの系列のどの時期が最も大きく動いたかを色だけで比べられます。
使いどころと落とし穴
#
ホライゾンチャートは、10〜50 本の時系列を縦に積んで、どの系列のいつが異常に高いか低いかを省スペースで比べるダッシュボード向きの図です。折りたたみの仕組みを知らない読者には直感的でないので、凡例に「濃い青 = 平均 +40 以上」のように段ごとの意味を書き、読み方の注釈を必ず添えてください。段数 levels を 4 以上にすると隣り合う色の差が見分けられなくなるため、2〜3 段に抑えます。一般の読者に向けた資料なら、同じ省スペースの目的でもスパークラインパネルの方が説明なしで伝わります。