スパイラルプロットで年内の周期を描き出す

上級

6.7.15

スパイラルプロットで年内の周期を描き出す

最終更新 2020-08-12 読了時間 1 分
まとめ
  • 日次データを極座標上に螺旋状に配置し、年間の周期パターンを描き出す。
  • projection="polar"ax.plotで螺旋曲線を描画しfill_betweenで塗る。
  • 週次・月次の周期性やピーク期間を発見したいときに使う。

年間のトレンドを一周の円に押し込み、経過日数で螺旋状に積み重ねると、季節性や周期のズレが見えやすくなります。極座標に変換するだけでユニークな可視化ができます。

 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
import numpy as np
import matplotlib.pyplot as plt

days = np.arange(365)
theta = 2 * np.pi * days / 30  # 30日ごとに一周
r = 5 + 0.01 * days + 1.2 * np.sin(2 * np.pi * days / 7)
rng = np.random.default_rng(12)
r += rng.normal(0, 0.3, size=days.size)

fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, projection="polar")
ax.plot(theta, r, color="#38bdf8", linewidth=1.2)
ax.fill_between(theta, 0, r, color="#bae6fd", alpha=0.5)

ax.set_theta_zero_location("N")
ax.set_theta_direction(-1)
ax.set_rticks([5, 7, 9])
ax.set_title("2024年 日次ユーザー滞在時間のスパイラルプロット", pad=16)

month_ticks = np.linspace(0, 2 * np.pi, 12, endpoint=False)
for idx, ang in enumerate(month_ticks):
    ax.text(ang, r.max() + 0.6, f"{idx + 1}月", ha="center", va="center")

fig.tight_layout()

plt.show()

極座標に変換するだけでユニークな可視化ができますの図

読み方のポイント #

  • 螺旋上で半径が大きくなるほど、値が伸びた期間。外側で太っている月がピークです。
  • 周期性が強ければ、同じ角度付近で波形が繰り返されます。
  • 一周を何日で割るかを調整すると、週次・月次など好みの周期で可視化できます。

いつ使うか #

  • 適している場面: 年単位の周期性(季節変動)を螺旋状に重ねて年ごとのパターン比較をしたいとき。
  • 不向きな場面: 螺旋の内側と外側で同じ角度でもアーク長が異なるため、値の正確な比較が困難です。
  • 代替手段: 折れ線グラフを年ごとに重ね描きする方がパターン比較をより正確に行えます。

よくある失敗パターン #

  • 内周と外周の弧長の違い: 螺旋の内側と外側では同じ角度でもアーク長が異なるため、値の面積表現が歪みます。色やラベルで補足してください。
  • 読者の馴染みの薄さ: 螺旋形は日常的でないため直感的に読めない人が多いです。凡例や読み方の注釈を必ず添えましょう。