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

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

言語 JA

積み上げエリアチャート

入門

06.4.2

積み上げエリアチャート

最終更新 2020-02-12 読了時間 2 分
まとめ
積み上げエリアチャートは、複数の系列を下から順に重ねて面で塗り、いちばん上の輪郭が合計、各帯の厚さが内訳を表す図です。ax.stackplot(hours, tablet, mobile, pc) のように渡した順番がそのまま積む順番になり、下に置いた系列ほど値を正確に読めます。この章では 0 時から 24 時までの PV をデバイス別に積み上げ、合計が最大になる 16 時と、その時点でスマホが占める割合を 1 枚で読みます。読み終えると、積む順番の決め方、alpha と colors の選び方、負の値を含むデータや割合表示が必要なときの切り替え方を判断できるようになります。

先に 複数ラインの推移比較 で ax.plot を重ねる描き方を見ておくと、「面で積むと何が変わるか」が比べやすくなります。

直感 #

1 日のアクセスを 4 時間ごとに集計すると、PC は 120 から 240、スマホは 200 から 300、タブレットは 80 から 180 へと、どれも昼過ぎから夕方にかけて増えます。3 本の折れ線で描けば個々の増減は追えますが、「全部でいくつか」「スマホは全体の何割か」は足し算しないと分かりません。積み上げエリアチャートは、いちばん下にタブレット、その上にスマホ、さらに上に PC と面を重ねるので、最上段の線が合計 PV、帯の厚さがそのデバイスの PV になります。16 時に合計が 700 まで膨らみ、そのうちスマホの帯が 280 を占める、という読み方を足し算なしでできるのがこの図の価値です。

Python で描く #

次のコードは、0 時から 24 時まで 4 時間おきの 7 時点の PV を 3 つの配列で用意し、ax.stackplot でタブレット・スマホ・PC の順に積み上げます。X 軸は 0〜24 に固定し、目盛りは観測した 7 時点だけに絞っています。

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

hours = np.array([0, 4, 8, 12, 16, 20, 24])
pc = np.array([120, 150, 180, 210, 240, 220, 180])
mobile = np.array([200, 220, 240, 260, 280, 300, 260])
tablet = np.array([80, 90, 120, 150, 180, 170, 140])

fig, ax = plt.subplots(figsize=(6, 4))
ax.stackplot(
    hours,
    tablet,
    mobile,
    pc,
    labels=["タブレット", "スマホ", "PC"],
    colors=["#bfdbfe", "#93c5fd", "#3b82f6"],
    alpha=0.85,
)
ax.set_xlim(0, 24)
ax.set_xticks(hours)
ax.set_ylabel("PV 数")
ax.set_xlabel("時間帯")
ax.set_title("時間帯別 トラフィック量")
ax.legend(loc="upper left", frameon=False)
ax.grid(axis="y", alpha=0.3)

fig.tight_layout()

plt.show()

面積がそのままアクセス量に対応するため、構成比の変化を直感的に把握できますの図

実行結果の読み方 #

最上段の輪郭は 0 時の合計 400 から 16 時の 700 まで上がり、20 時に 690、24 時に 580 へ下がります。16 時の断面を縦に読むと、下からタブレット 180、スマホ 280、PC 240 で、スマホの帯が最も厚い時間帯です。最下段のタブレットは下端が常に 0 なので値を直接読めますが、最上段の PC は下端も上端も動くため、「PC だけが増えたのか、下の 2 つが増えて押し上げられたのか」は帯の厚さを目で測るしかありません。PC 単独の増減を正確に比べたいときは 複数ラインの推移比較 の折れ線に戻します。

使いどころと落とし穴 #

積み上げエリアチャートが向くのは、PC・スマホ・タブレットのように「内訳の合計」に意味があり、その合計と構成比の推移を同時に伝えたい場面です。構成比そのものを比べたいなら、各系列を pc + mobile + tablet で割って 0〜1 の割合にしてから stackplot に渡すと、常に合計 100% の帯になります。落とし穴は 2 つあります。1 つ目は積む順番で、16 時に 300 まで跳ねるスマホのような変動の大きい系列を下に置くと、その上に乗る帯がすべて一緒に揺れて読めなくなるので、安定した系列を下に置きます。2 つ目は負の値で、返金や在庫の減少のように負になる系列があると面が重なって意味が壊れるため、stackplot に渡す前に (pc < 0).any() のような確認を入れます。