📦

matplotlibのboxplotで箱ひげ図の横に数値を表記する

2022/08/25に公開

概要

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