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

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

言語 JA

極座標の面積チャート

中級

06.7.5

極座標の面積チャート

最終更新 2020-03-25 読了時間 2 分
まとめ
極座標面積チャート(ポーラーエリアチャート)は、12 か月や 24 時間のように「一周して戻る」周期データを円周上に並べ、各区間の値を中心からの半径で表す図です。12 月と 1 月が隣り合うので、年末年始をまたぐ山や谷が途切れずに読めるのが棒グラフとの違いです。matplotlib では plt.subplots(subplot_kw=dict(polar=True)) で極座標の軸を作り、ax.bar(angles, volume, width=2 * np.pi / 12) に角度と値を渡すだけで扇形が並びます。読み終えると、6 月に 350 件でピークを迎え 1 月の 120 件が谷になる季節性を円の形から読み取り、同時に「扇形の面積は半径の 2 乗で増えるので差が誇張される」という落とし穴を踏まえて使えるようになります。

直感 #

月別の問い合わせ件数を 12 本の棒グラフにすると、12 月の棒と 1 月の棒は図の両端に離れてしまい、「冬の谷」が 2 つに分断されて見えます。時計の文字盤のように 12 か月を円周に並べ、各月の値を中心からの長さにすれば、12 月の隣に 1 月が来て冬の谷が 1 つのくぼみとして見えます。扇形が外に張り出した方向がピークの季節で、この例では 6 月(350 件)に向かって最も大きく膨らみます。ただし扇形の面積は半径の 2 乗に比例するので、件数が 2 倍の月は面積では 4 倍に見え、差が誇張されることを頭に入れて読む必要があります。

Python で描く #

次のコードは 12 か月の件数を用意し、月番号を角度(0 から 2π を 12 等分)に変換して、極座標の ax.bar で 12 本の扇形を描きます。目盛りラベルを「1月」〜「12月」に置き換え、半径の目盛りは消します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt

months = np.arange(12)
angles = months / 12 * 2 * np.pi
volume = np.array([120, 140, 200, 260, 310, 350, 330, 280, 220, 180, 150, 130])

fig, ax = plt.subplots(figsize=(5, 5), subplot_kw=dict(polar=True))
ax.bar(angles, volume, width=2 * np.pi / 12, color="#3b82f6", alpha=0.7, edgecolor="white")

ax.set_xticks(angles)
ax.set_xticklabels([f"{m+1}月" for m in months])
ax.set_title("月別問い合わせ件数(極座標チャート)")
ax.set_yticks([])

fig.tight_layout()

plt.show()

季節性の傾向を 360 度の円で確認できますの図

実行結果の読み方 #

中心から外へ長く伸びた扇形ほど件数が多く、この例では 5〜7 月(310〜350 件)の方向に大きく膨らみ、12 月から 1 月(130〜120 件)にかけてが最も短くなります。12 月と 1 月が円周上で隣り合うため、冬の谷が途切れずに 1 つのくぼみとして読めます。扇形の長さ(半径)を比べれば件数の比較は正しいのですが、面積で比べると 6 月は 1 月の約 3 倍の件数が約 8.5 倍の面積に見えるので、「どのくらい多いか」は半径で読むように意識してください。

使いどころと落とし穴 #

極座標面積チャートは、月別・曜日別・時間帯別のように「周期的で、終わりと始まりがつながる」データのピークの方向を直感的に見せる用途に向いています。正確な値の比較が目的なら、長さだけで比べられる通常の棒グラフの方が誤読がありません。面積の誇張を避けたい場合は、ax.bar(angles, np.sqrt(volume)) のように半径を値の平方根にすると面積が値に比例します。セクターが 12 を超えると隣どうしの差が分かりにくくなるので、時間帯なら 24 を 3 時間ごとの 8 区間にまとめるなど、12 本以下に抑えてください。複数年を重ねるときは alpha を年ごとに変えるか、扇形ではなく ax.plot の折れ線で輪を重ねると見やすくなります。