Matplotlibの箱ひげ図#
公開日
箱ひげ図をプロットするには、ax.boxplot
を使用します。ax.boxplot
に渡すデータ(以下の例ではx
)が1次元配列の場合、箱ひげ図は1個だけ出力されます。一方、データが2次元配列の場合、箱ひげ図は列の数だけ出力されます。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
np.random.seed(seed=0)
x = np.random.normal(10, 5, 1000).reshape(-1,2)
# 平均10, 標準偏差5の正規分布。500行2列の配列データを生成
fig, ax = plt.subplots()
ax.boxplot(x)
plt.show()
![../_images/c62f691bdecbf461f71eaf361d35e813ef7fe7858af5b88c457feff282dfac4e.png](../_images/c62f691bdecbf461f71eaf361d35e813ef7fe7858af5b88c457feff282dfac4e.png)
箱ひげ図の説明を以下に示します。IQRは第1四分位点から第3四分位点までの長さです。デフォルトのひげの長さは1.5×IQRとなります(長さはwhis
オプションで変更可能です)。
fig, ax = plt.subplots()
ax.boxplot(x[:, 0])
ax.annotate("外れ値", xy=(1.03, 23.5), xytext=(1.2, 22.5), size=15, arrowprops={"arrowstyle": "->"})
ax.annotate("Q3+1.5×IQR", xy=(1.04, 22.5), xytext=(1.15, 20), size=15, arrowprops={"arrowstyle": "->"})
ax.annotate("第3四分位点(Q3)", xy=(1.08, 13), xytext=(1.15, 12.5), size=15, arrowprops={"arrowstyle": "->"})
ax.annotate("中央値", xy=(1.08, 9.5), xytext=(1.15, 9), size=15, arrowprops={"arrowstyle": "->"})
ax.annotate("第1四分位点(Q1)", xy=(1.08, 6.5), xytext=(1.15, 6), size=15, arrowprops={"arrowstyle": "->"})
ax.annotate("Q1-1.5×IQR", xy=(1.04, -3), xytext=(1.15, -2), size=15, arrowprops={"arrowstyle": "->"})
ax.annotate("", xy=(0.9, 13.5), xytext=(0.9, 6), arrowprops={"arrowstyle": "<->"})
ax.text(0.82, 9.5, "IQR", size=15)
plt.show()
![../_images/b08701ecfd954b5b6c645376c24ce2890a02cbc38bfc0aa9e71111d0052d2f35.png](../_images/b08701ecfd954b5b6c645376c24ce2890a02cbc38bfc0aa9e71111d0052d2f35.png)
boxplotのオプション#
boxplotで指定できる主なオプションを以下に示します。
sym
(str): 外れ値記号の見た目flierprops
(dict): 外れ値記号の見た目vert
(bool):True
の場合、箱ひげ図は横向きになる(デフォルト:False
)whis
(float/(float, float)): ひげの開始位置(デフォルト:1.5
)widths
(float): 箱の幅labels
(sequence): データのラベル(横軸に表示)showmeans
(bool):True
の場合、平均値を表示する(デフォルト:False
)
外れ値記号の見た目#
sym
オプションやflierprops
オプションで外れ値の色と記号を変更できます。
sym
オプション(str形式)では、色と記号を組み合わせて指定できますが、その場合は1文字で定義できる色しか対応していないようです。
詳細に設定する場合は、flierprops
オプション(dict形式)を用います。主な指定可能オプションを以下に示します。
キー |
説明 |
---|---|
|
マーカーの形状 |
|
塗り潰しの色 |
|
マーカーの枠線の色 |
|
マーカーのサイズ |
1文字で定義できる色と、マーカーの種類を以下に示します。
color |
説明 |
---|---|
|
青 (Blue) |
|
緑 (Green) |
|
赤 (Red) |
|
シアン (Cyan) |
|
マゼンタ (Magenta) |
|
黄 (Yellow) |
|
黒 (Black) |
|
白 (White) |
marker |
説明 |
---|---|
|
丸 |
|
下向き三角 |
|
上向き三角 |
|
左向き三角 |
|
右向き三角 |
|
四角形(square) |
|
五角形(pentagon) |
|
+記号 |
|
x記号 |
|
ダイヤモンド |
fig, ax = plt.subplots()
ax.boxplot(x, sym="b+") # 青の+記号
plt.show()
fig, ax = plt.subplots()
ax.boxplot(x, sym="pink") # 記号の種類を定義しない場合、複数文字の色も指定できる
plt.show()
fig, ax = plt.subplots()
ax.boxplot(x, flierprops={"marker":"o", "markerfacecolor":"blue", "markeredgecolor":"red", "ms":10})
plt.show()
![../_images/c595716600ddd18272b5069d205ad788d7bf9c459fcac5a5626b6673f2b97c2e.png](../_images/c595716600ddd18272b5069d205ad788d7bf9c459fcac5a5626b6673f2b97c2e.png)
![../_images/4057a8988f5199dfe40a854addea1d29b8ad498679a43496bf628553808b0476.png](../_images/4057a8988f5199dfe40a854addea1d29b8ad498679a43496bf628553808b0476.png)
![../_images/6392f60d8b14ce23087b03aa975b1562e4cc0f08fca94723a3fdd5e4ac61f59b.png](../_images/6392f60d8b14ce23087b03aa975b1562e4cc0f08fca94723a3fdd5e4ac61f59b.png)
横向きの箱#
箱を横向きにするには、vert=False
と指定します。
fig, ax = plt.subplots()
ax.boxplot(x, vert=False)
plt.show()
![../_images/6f0b99768cfb08ffe78d8afb14807e1c462ca8bac5cc9e46a15f85017c03602e.png](../_images/6f0b99768cfb08ffe78d8afb14807e1c462ca8bac5cc9e46a15f85017c03602e.png)
ひげの長さ#
ひげの開始位置はwhis
オプションで変更できます。指定する方法は2つあり、float
型の変数を1つ与える場合と、(float, float)
とタプルで与える場合で挙動が異なります。
まず、float
型の変数を1つ与える場合、ひげの長さはIQR×whis
となります(whis
のデフォルト値は1.5
. また、IQRは第1四分位点と第3四分位点の長さです)。
以下はwhis=1
とした例です。ひげの長さと箱の長さは同じとなります。
fig, ax = plt.subplots()
ax.boxplot(x, whis=1)
plt.show()
![../_images/2c0dbd56ab99a1ad54cec2daf48f848c2aa8e1fe2495fa098daf8fcf311390e5.png](../_images/2c0dbd56ab99a1ad54cec2daf48f848c2aa8e1fe2495fa098daf8fcf311390e5.png)
次に、whis
オプションに(float, float)
とタプルで与える場合について述べます。例えばwhis=(1, 99)
として与えた場合、データの下位から1%~99%の範囲を含むように長さが設定されます。
fig, ax = plt.subplots()
ax.boxplot(x, whis=(1, 99))
plt.show()
![../_images/ef43e84f1e0ffe867c7f504f0e2f7f18b3f5551063337d7d70e6acfeef8675d9.png](../_images/ef43e84f1e0ffe867c7f504f0e2f7f18b3f5551063337d7d70e6acfeef8675d9.png)
箱の幅#
widths
オプションで箱の幅を指定できます(デフォルトは0.5
、またはグラフの幅から自動的に決定されます)。
fig, ax = plt.subplots()
ax.boxplot(x, widths=0.3)
plt.show()
![../_images/f1c9596b16501317c589dc3a082f8e53dfd8b887eaea501fed9f25178c79c757.png](../_images/f1c9596b16501317c589dc3a082f8e53dfd8b887eaea501fed9f25178c79c757.png)
データのラベル#
labels
オプションでデータのラベルを指定できます。
fig, ax = plt.subplots()
ax.boxplot(x, labels=["AAA", "BBB"])
plt.show()
C:\Users\wazxd\AppData\Local\Temp\ipykernel_12784\3208676080.py:2: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.
ax.boxplot(x, labels=["AAA", "BBB"])
![../_images/7ec02152d86158496658a755ccc6ed858d28ee7a804446683147bb68314d8504.png](../_images/7ec02152d86158496658a755ccc6ed858d28ee7a804446683147bb68314d8504.png)
平均値の表示#
平均値を表示するにはshowmeans=True
とします。平均値マーカーの表示方法は、meanprops
オプションに辞書形式で指定できます。
fig, ax = plt.subplots()
ax.boxplot(x, showmeans=True)
plt.show()
fig, ax = plt.subplots()
ax.boxplot(x, showmeans=True, meanprops={"marker":"x", "markeredgecolor":"blue", "ms":10})
plt.show()
![../_images/093557079d3f65eba7b00c9be7624781e9c5396858ca5307c23aa7331f5b9468.png](../_images/093557079d3f65eba7b00c9be7624781e9c5396858ca5307c23aa7331f5b9468.png)
![../_images/d53c6d496b74b51e412f16885ffff722cd08b2daa4033cb0a757dd066d86e1c0.png](../_images/d53c6d496b74b51e412f16885ffff722cd08b2daa4033cb0a757dd066d86e1c0.png)