matplotlibのboxplotで箱ひげ図の横に数値を表記する
概要
matplotlibのboxplotで箱ひげ図を出した際に、具体的な四分位数や最小値、最大値の値がわからず困っていました。
今回は、boxplotで出した画像内に具体的な数値を表示させるコードを書いたので記事にしたいと思います。
実行環境
python 3.9.0
matplotlib 3.5.3
numpy 1.23.2
やったこと
numpyで四分位数を計算
今回は、numpyで標準正規分布に従うランダムなリストを使って、目標の箱ひげ図を作ります。
四分位数はnp.percentile()
で簡単に計算できます。
import numpy as np
# ランダムなリストを生成
my_list = np.random.randn(100)
# 四分位数を計算
q25, q50, q75 = np.percentile(my_list, [25, 50, 75])
四分位数から最小値、最大値を計算
箱ひげ図では下のひげの端がデータ内の最小値、上のひげの端が最大値になりますが、外れ値がある場合は外れ値を抜いたデータ内の最小値、最大値になります。外れ値に関しては、matplotlibの公式ドキュメントに以下のように記載されています。
The whiskers extend from the box by 1.5x the inter-quartile range (IQR). Flier points are those past the end of the whiskers.
ひげの長さは四分位範囲の1.5倍までで、その中に入らないデータが外れ値になるようです。これをもとに、最小値と最大値を出します。
import matplotlib.pyplot as plt
# 四分位範囲を計算
iqr = q75 - q25
# 外れ値を抜いた新しいリストを作成
new_list = []
for i in my_list:
if (q25 - 1.5 * iqr) <= i <= (q75 + 1.5 * iqr):
new_list.append(i)
text_list = [min(new_list), q25, q50, q75, max(new_list)]
グラフ出力
あとは出した四分位数と最小値、最大値をグラフにプロットして出力していくだけです。(今回は外れ値の表示をオフにしています)
# 箱ひげ図をプロット
plt.boxplot(my_list, showfliers=False)
# 四分位数、最小値、最大値をプロット
for text in text_list:
plt.text(x=1.1, y=text, s=str(text))
plt.show()
出力結果
単純にプロットしただけなので若干見にくい気もしますが、無事具体的な数値を表示させることができました。
最後に
箱ひげ図でなんとなくの分布を見つつ、じゃあ最大値はいくつなの!?とか中央値はいくつなの!?と具体的な数値も同時に見たく、やきもきしていたので今回コードを書くに至りました。同じように悩んでいる方の参考になればと思います。もっと簡単な方法もあれば教えて下さい!
Discussion