箱ひげ図
boxplot【箱ひげ図 (データ指定)】3.1 / 3.2 / 3.4 / 3.6
bxp【箱ひげ図 (要約統計量指定)】3.1 / 3.6

箱ひげ図のサンプル

axes.Axes.boxplot【箱ひげ図 (データ指定)】3.1 / 3.2 / 3.4 / 3.6
pyplot.boxplot【箱ひげ図 (データ指定)】3.1 / 3.2 / 3.4 / 3.6

メモ

用語

箱ひげ図の用語
用語備考
最大値データの最大値 (外れ値を除く)
Q3第3四分位点データを大きさ順に並べて、小さい値から数えて 3/4 (75%) 番目に当たる値
IQR四分位範囲
(IQR:interquartile range)
Q3【第3四分位点】Q1【第1四分位点】の差
(ボックスの高さ)
median中央値データを大きさ順に並べて、中央に位置する値
mean平均値データの平均値 (デフォルト:非表示)
Q1第1四分位点データを大きさ順に並べて、小さい値から数えて 1/4 (25%) 番目に当たる値
最小値データの最小値 (外れ値を除く)
whiskerひげ外れ値を除く、上位・下位の 25% の範囲
(デフォルト:上下限はIQR【四分位範囲】の1.5倍の長さ)
capキャップひげの両端を表す線分
flier外れ値ひげの外側の値

基本

例 (axes.Axes.boxplot) 〕〔 例 (pyplot.boxplot)

ひげの長さ

  • whis (ひげの位置)
    • IQRに対する上下限の倍率指定:超えた値は外れ値
      ひげ端は外れ値を除く最大値と最大値
    • パーセンタイル指定:ひげ端をパーセンタイルで指定
      例:
      (10, 90):ひげ端は10パーセンタイルと90パーセンタイル
      (0, 100):ひげ端は最大値・最大値 (外れ値なし)
  • autorange (自動範囲設定 有無)
    • 極端なデータ分布 (Q1 == Q3) での扱い

値表示

  • ユーティリティ関数 cbook.boxplot_stats【要約統計量取得 (箱ひげ図)】で各種値を取得
  • 取得値を元に適切な座標に描画

バイオリン図との比較

  • データ分布のピークが複数ある (二峰性・多峰性) 場合には不向き

各部分のスタイル等

  • 引数・戻り値で指定

関連設定


構文

axes.boxplot(
    x (データ),
    notch (ノッチ有無)=None,
    sym (外れ値デフォルト記号)=None,
    vert (プロット方向)=None,
    whis (ひげ位置)=None,
    positions (ボックス位置)=None,
    widths (ボックス幅)=None,
    patch_artist (ボックス描画方法)=None,
    bootstrap (ブートストラップ回数)=None,
    usermedians (中央値指定)=None,
    conf_intervals (ノッチ位置)=None,
    meanline (平均値ライン表示有無)=None,
    showmeans (平均値表示有無)=None,
    showcaps (キャップ表示有無)=None,
    showbox (ボックス表示有無)=None,
    showfliers (外れ値 表示有無)=None,
    boxprops (ボックス スタイル)=None,
    labels (ラベル)=None,
    flierprops (外れ値 スタイル)=None,
    medianprops (中央値 スタイル)=None,
    meanprops (平均値 スタイル)=None,
    capprops (キャップ スタイル)=None,
    whiskerprops (ひげ スタイル)=None,
    manage_xticksmanage_ticks (目盛り・ラベルの位置調整の有無)3.1 =True,
    autorange (自動範囲設定 有無)=False,
    zorder (Zオーダー)=None,
    capwidths (キャップ幅)3.6 =None,
    *,
    data (ラベル名指定データ)=None)

※ 全ての引数は、ラベル名指定が可能 (詳細は、data (ラベル名指定データ) 参照)
pyplot.boxplot(同上)
戻り値 (dict)各コンポーネント (キーは以下参照)
    boxes (list[Line2D] | list[PathPatch])ボックス
    medians (list[Line2D])中央値
    whiskers (list[Line2D])ひげ
    caps (list[Line2D])キャップ
    fliers (list[Line2D])外れ値
    means (list[Line2D])平均値

x (配列 | ベクトルのシーケンス)データ
notch (bool)ノッチ有無 (True:ノッチあり / False:ノッチなし)
sym (str)外れ値デフォルト記号 (マーカー定義マーカースタイルflierprops (外れ値スタイル)も参照)
    省略:中抜き円
vert (bool)プロット方向 (True:垂直方向 / False:水平方向)
whis (float | (float, float))ひげ位置 (デフォルト:1.5)
    floatボックスの高さ(幅)に対する上下限の倍率 (ひげ端:外れ値を除いた最大値と最小値)
    (float, float) 3.2パーセンタイル〔例:(5, 95) 〕
    'range' 3.23.4ひげ端を最小値と最大値に設定 (代替:(0, 100)指定)
positions (配列形式)ボックス位置 (デフォルト:[1, 2, …, n])
widths (float | 配列形式)ボックス幅 (重ならない最大幅:1.0)
patch_artist (bool)ボックス描画方法 (True:Patch【区画】 / False:Line2D【線分】)
    (Patch【区画】は内部の色付け等可)
bootstrap (int)ブートストラップ回数 (中央値の計算で使用)
    Noneガウス ベースの漸近近似で計算
    その他95%の信頼区間の決定回数 (1000〜10000 を推奨)
usermedians (1次元配列形式)中央値指定 (None:自動計算 / その他:指定中央値を使用)
conf_intervals (2次元配列形式)ノッチ位置 (None:自動計算 / :ノッチ位置)
meanline (bool)平均値ライン表示有無 (True:ライン表示 / False:ポイント表示) showmeans
showmeans (bool)平均値表示有無 (True:表示あり / False:表示なし)
showcaps (bool)キャップ表示有無 (True:表示あり / False:表示なし)
showbox (bool)ボックス表示有無 (True:表示あり / False:表示なし)
showfliers (bool)外れ値表示有無 (True:表示あり / False:表示なし)
boxprops (dict)ボックス スタイル
labels (シーケンス)ラベル (ボックス数分)
flierprops (dict)外れ値スタイル (sym (外れ値デフォルト記号)も参照)
medianprops (dict)中央値スタイル
meanprops (dict)平均値スタイル
capprops (dict)キャップスタイル
whiskerprops (dict)ひげスタイル
manage_xticks (bool)manage_ticks (bool)3.1目盛り・ラベルの位置調整の有無 (True:位置調整あり / False:位置調整なし)
autorange (bool)自動範囲設定 有無 (True:自動範囲設定あり / False:自動範囲設定なし)
    (自動範囲設定:Q1 == Q3 となる極端な分布のとき、1つも外れ値とせず有効データ範囲を設定)
zorder (float)Zオーダー (省略:2)
capwidths (float | 配列)3.6キャップ幅
以降はキーワード引数
data (インデックス可能オブジェクト)ラベル名指定データ
各引数にラベル名を指定し、ラベル名と実際の値をここで指定 (全ての引数が対象)

設定・グラフパーツ

設定・グラフパーツ の抜粋〔

pyplot.axes.Axes.その他
タイトルsuptitle【タイトル設定 (全体)】
title【タイトル設定】
set_title【タイトル設定】
get_title【タイトル取得】
Axes3D.set_title【タイトル設定】
figure.Figure.suptitle【タイトル設定 (全体)】
figure.SubFigure.suptitle
軸ラベルxlabel【x軸ラベル 設定】3.3
ylabel【y軸ラベル 設定】3.3
set_xlabel【x軸ラベル 設定】3.3
set_ylabel【y軸ラベル 設定】3.3
Axes3D.set_zlabel【z軸ラベル 設定】

get_xlabel【x軸ラベル 取得】
get_ylabel【y軸ラベル 取得】
Axes3D.get_zlabel【z軸ラベル 取得】
figure.Figure.supxlabel【x軸ラベル(全体) 設定】3.43.6
figure.Figure.supylabel【y軸ラベル(全体) 設定】3.43.6
figure.SubFigure.supxlabel
figure.SubFigure.supylabel
clabel【等高線ラベル 設定】
bar_label【バーラベル】3.43.7
表示範囲xlim【x軸表示範囲 取得・設定】
ylim【y軸表示範囲 取得・設定】
axis【表示範囲等 取得・設定】3.1~3.4 / 3.7
set_xlim【x軸表示範囲 設定】3.1 / 3.6
set_ylim【y軸表示範囲 設定】3.1 / 3.6
get_xlim【x軸表示範囲 取得】
get_ylim【y軸表示範囲 取得】
axis【表示範囲等 取得・設定】3.1~3.4 / 3.7
projections.polar.PolarAxes.set_rlim【極座標範囲 設定】
Axes3D.set_xlim【3D x軸表示範囲 設定】
Axes3D.set_xlim3d【3D x軸表示範囲 設定】
Axes3D.set_ylim【3D y軸表示範囲 設定】
Axes3D.set_ylim3d【3D y軸表示範囲 設定】
Axes3D.set_zlim【3D z軸表示範囲 設定】
Axes3D.set_zlim3d【3D z軸表示範囲 設定】
Axes3D.get_xlim3d【3D x軸表示範囲 取得】
Axes3D.get_ylim3d【3D y軸表示範囲 取得】
Axes3D.get_zlim3d【3D z軸表示範囲 取得】
データ上限・下限set_xbound【x軸データ上限・下限 設定】
set_ybound【y軸データ上限・下限 設定】
get_xbound【x軸データ上限・下限 取得】
get_ybound【y軸データ上限・下限 取得】
projections.polar.PolarAxes.set_rmax【極座標上限 設定】
projections.polar.PolarAxes.set_rmin【極座標下限 設定】
目盛りxticks【x軸目盛り (ラベル) 取得・設定】3.6
yticks【y軸目盛り (ラベル) 取得・設定】3.6
locator_params【目盛り制御】
minorticks_on
minorticks_off
ticklabel_format【目盛りフォーマット設定 (指数形式)】
tick_params【目盛り・グリッド線 外観変更】
set_xticks【x軸目盛り 設定】3.2 / 3.5
set_yticks【y軸目盛り 設定】3.2 / 3.5
Axes3D.set_zticks【z軸目盛り 設定】

set_xticklabels【x軸目盛りラベル 設定】3.3 / 3.5
set_yticklabels【y軸目盛りラベル 設定】3.3 / 3.5
Axes3D.set_zticklabels【z軸目盛りラベル 設定】

get_xticks【x軸目盛り 取得】3.2
get_yticks【y軸目盛り 取得】3.2
Axes3D.get_zticks【z軸目盛り 取得】

get_xticklabels【x軸目盛りラベル 取得】3.3 / 3.6
get_yticklabels【y軸目盛りラベル 取得】3.3 / 3.6
Axes3D.get_zticklabels【z軸目盛りラベル 取得】

get_xmajorticklabels【x軸目盛りラベル 取得 (主)】3.3 / 3.6
get_ymajorticklabels【y軸目盛りラベル 取得 (主)】3.3 / 3.6
get_xminorticklabels【x軸目盛りラベル 取得 (補助)】3.3 / 3.6
get_yminorticklabels【y軸目盛りラベル 取得 (補助)】3.3 / 3.6
get_xticklines
get_yticklines
xaxis_date
yaxis_date
minorticks_on
minorticks_off
ticklabel_format【目盛りフォーマット設定 (指数形式)】
tick_params【目盛り・グリッド線 外観変更】
locator_params【目盛り制御】
fmt_xdata
fmt_ydata
ticker【目盛りモジュール】
axis.Axis.set_ticks【目盛り 設定】
axis.Axis.set_ticklabels【目盛りラベル 設定】
axis.Axis.set_tick_params【目盛り・グリッド線 外観変更】
axis.XAxis.set_ticks_position【x軸目盛り位置 設定】
axis.YAxis.set_ticks_position【y軸目盛り位置 設定】
Axes3D.locator_params【目盛り制御】

axis.Axis.set_major_formatter【フォーマッタ設定 (主)】
axis.Axis.set_minor_formatter【フォーマッタ設定 (補助)】
axis.Axis.set_major_locator【ロケータ設定 (主)】
axis.Axis.set_minor_locator【ロケータ設定 (補助)】
axis.Axis.get_ticklabels【目盛りラベル取得】
axis.Axis.get_majorticklabels【目盛りラベル取得 (主)】
axis.Axis.get_minorticklabels【目盛りラベル取得 (補助)】
axis.Axis.get_major_formatter【フォーマッタ取得 (主)】
axis.Axis.get_minor_formatter【フォーマッタ取得 (補助)】
axis.Axis.get_ticklocs
axis.Axis.get_major_locator【ロケータ取得 (主)】
axis.Axis.get_minor_locator【ロケータ取得 (補助)】
figure.Figure.autofmt_xdate【x軸日付目盛りラベル回転】
axis.Axis.get_tick_params【目盛り・グリッド線 外観取得】3.7
直線
範囲
axhline【水平線 (単一)】
axvline【垂直線 (単一)】
hlines【水平線 (複数)】3.3
vlines【垂直線 (複数)】3.3
axhspan【水平範囲】
axvspan【垂直範囲】
axline【直線】3.3

例:基本 (axes.Axes.boxplot)

import matplotlib.pyplot as plt
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    2, 2,
    figsize=(6, 6),
    tight_layout=True,
)

# データ
rng = np.random.default_rng(12345)
dataset_0 = rng.normal(loc=30, scale=30, size=200).astype(int)
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = rng.normal(loc=50, scale=10, size=200).astype(int)
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = rng.normal(loc=70, scale=10, size=200).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0, 0)
axs[0, 0].set_title('通常データ指定 (単一図)')
axs[0, 0].boxplot(
    dataset_1,
    labels=['Data 1'],
)

# グラフ (0, 1)
axs[0, 1].set_title('通常データ指定 (複数図)')
axs[0, 1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
)

# グラフ (1, 0)
axs[1, 0].set_title('ラベル名指定データ\n(水平方向・単一図)')
axs[1, 0].boxplot(
    'DATASET',
    labels='LABELS',
    vert='VERT',
    data={
        'DATASET': dataset_1,
        'VERT': False,
        'LABELS': ['Data 1'],
    }
)

# グラフ (1, 1)
axs[1, 1].set_title('ラベル名指定データ\n(水平方向・複数図)')
axs[1, 1].boxplot(
    'DATASET',
    labels='LABELS',
    vert='VERT',
    data={
        'DATASET': [dataset_0, dataset_1, dataset_2],
        'VERT': False,
        'LABELS': ['Data 0', 'Data 1', 'Data 2'],
    }
)

# 表示
plt.show()

axes.Axes.boxplot【箱ひげ図 (データ指定)】基本のサンプル画像


例:基本 (pyplot.boxplot)

import matplotlib.pyplot as plt
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
plt.figure(
    figsize=(3, 3),
    tight_layout=True,
)

# データ
rng = np.random.default_rng(12345)
dataset_0 = rng.normal(loc=30, scale=30, size=200).astype(int)
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = rng.normal(loc=50, scale=10, size=200).astype(int)
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = rng.normal(loc=70, scale=10, size=200).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ
plt.title('pyplot.boxplot\n【箱ひげ図 (データ指定)】')
plt.boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
)

# 表示
plt.show()

pyplot.boxplot【箱ひげ図 (データ指定)】基本のサンプル画像


例:ひげの長さ

import matplotlib.pyplot as plt
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    3, 2,
    figsize=(6, 9),
    tight_layout=True,
)

# データ
rng = np.random.default_rng(12345)
dataset_0 = rng.normal(loc=30, scale=30, size=200).astype(int)
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = rng.normal(loc=50, scale=10, size=200).astype(int)
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = rng.normal(loc=70, scale=10, size=200).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0, 0)
axs[0, 0].set_title('デフォルト:whis = 1.5')
axs[0, 0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
)

# グラフ (0, 1)
axs[0, 1].set_title('whis = 1.0')
axs[0, 1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
    whis=1.0,
)

# グラフ (1, 0)
axs[1, 0].set_title('whis = (5, 95)')
axs[1, 0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
    whis=(5, 95),
)

# グラフ (1, 1)
axs[1, 1].set_title('whis = (0, 100)')
axs[1, 1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
    whis=(0, 100),
)

# データ (Q1 == Q3)
data_edge = [
    50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
    30,
    70,
]

# グラフ (2, 0)
axs[2, 0].set_title('autorange=False')
axs[2, 0].boxplot(
    data_edge,
    labels=['Data'],
    autorange=False,
)

# グラフ (2, 1)
axs[2, 1].set_title('autorange=True')
axs[2, 1].boxplot(
    data_edge,
    labels=['Data'],
    autorange=True,
)

# 表示
plt.show()

箱ひげ図【ひげの長さ】のサンプル画像


例:値表示

import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fontdict = {
    'size': 10,
    'weight': 'bold',
    'color': 'red',
    'ha': 'left',
    'va': 'center',
}
fontdict_mean = {
    'size': 10,
    'weight': 'bold',
    'color': 'blue',
    'ha': 'right',
    'va': 'center',
}
fig, axs = plt.subplots(
    2, 1,
    figsize=(6, 8),
    tight_layout=True,
)

# データ
rng = np.random.default_rng(12345)
dataset_0 = rng.normal(loc=30, scale=30, size=200).astype(int)
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = rng.normal(loc=50, scale=10, size=200).astype(int)
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = rng.normal(loc=70, scale=10, size=200).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0)
axs[0].set_title('値表示 (単一図)')
axs[0].boxplot(
    dataset_1,
    labels=['Data 1'],
    showmeans=True,  # 平均値の表示有無
)
# 値表示
stats_1 = cbook.boxplot_stats(dataset_1)
x = 1.1
axs[0].text(
    x, stats_1[0]['whishi'],
    f'最大値:{stats_1[0]["whishi"]}',
    fontdict)
axs[0].text(
    x, stats_1[0]['q3'],
    f'Q3:{stats_1[0]["q3"]:6.2f}',
    fontdict)
axs[0].text(
    0.9, stats_1[0]['mean'],
    f'平均値(▲):{stats_1[0]["mean"]:6.2f}',
    fontdict_mean)
axs[0].text(
    x, stats_1[0]['med'],
    f'中央値:{stats_1[0]["med"]:6.2f}',
    fontdict)
axs[0].text(
    x, stats_1[0]['q1'],
    f'Q1:{stats_1[0]["q1"]:6.2f}',
    fontdict)
axs[0].text(
    x, stats_1[0]['whislo'],
    f'最小値:{stats_1[0]["whislo"]}',
    fontdict)
for i in range(len(stats_1[0]['fliers'])):
    axs[0].text(
        x, stats_1[0]['fliers'][i],
        f'外れ値:{stats_1[0]["fliers"][i]}',
        fontdict)

# グラフ (1)
axs[1].set_title('値表示 (複数図)')
axs[1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
    showmeans=True,  # 平均値の表示有無
)
# 値表示
stats = cbook.boxplot_stats([dataset_0, dataset_1, dataset_2])
for i in range(len(stats)):
    x = i + 1.2
    # 最大値
    axs[1].text(
        x, stats[i]['whishi'],
        f'{stats[i]["whishi"]}',
        fontdict)
    # Q3【第3四分位点】
    axs[1].text(
        x, stats[i]['q3'],
        f'{stats[i]["q3"]:6.2f}',
        fontdict)
    # median【中央値】
    axs[1].text(
        x, stats[i]['med'],
        f'{stats[i]["med"]:6.2f}',
        fontdict)
    # mean【平均値】
    axs[1].text(
        i + 0.8,
        stats[i]['mean'],
        f'{stats[i]["mean"]:6.2f}',
        fontdict_mean)
    # Q1【第1四分位点】
    axs[1].text(
        x, stats[i]['q1'],
        f'{stats[i]["q1"]:6.2f}',
        fontdict)
    # 最小値
    axs[1].text(
        x, stats[i]['whislo'],
        f'{stats[i]["whislo"]}',
        fontdict)
    # flier【外れ値】
    for j in range(len(stats[i]['fliers'])):
        axs[1].text(
            x, stats[i]['fliers'][j],
            f'{stats[i]["fliers"][j]}',
            fontdict)

# 表示
plt.show()

箱ひげ図【値表示】のサンプル画像


例:バイオリン図との比較

import matplotlib.pyplot as plt
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    1, 2,
    figsize=(6, 3),
    tight_layout=True,
)

# データ
rng = np.random.default_rng(12345)
dataset_0 = np.r_[
    rng.normal(loc=25, scale=10, size=200).astype(int),
    rng.normal(loc=75, scale=10, size=200).astype(int),
]
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = np.append(  # 外れ値追加
    dataset_0,
    [-60, 160],
)
dataset_2 = rng.normal(loc=50, scale=35, size=400).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0)
axs[0].set_title('箱ひげ図')
axs[0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
)
axs[0].set_ybound(-80, 180)

# グラフ (1)
axs[1].set_title('バイオリン図')
axs[1].violinplot(
    [dataset_0, dataset_1, dataset_2],
    showmedians=True,  # 中央値の表示有無
)
axs[1].set_xticks(
    [1, 2, 3],
    ['Data 0', 'Data 1', 'Data 2'],
)
axs[1].set_ybound(-80, 180)

# 表示
plt.show()

箱ひげ図【バイオリン図との比較】のサンプル画像


例:各部分のスタイル等

import matplotlib.pyplot as plt
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    2, 2,
    figsize=(6, 6),
    tight_layout=True,
)

# データ
rng = np.random.default_rng(12345)
dataset_0 = rng.normal(loc=30, scale=30, size=200).astype(int)
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = rng.normal(loc=50, scale=10, size=200).astype(int)
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = rng.normal(loc=70, scale=10, size=200).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0, 0)
axs[0, 0].set_title('デフォルト (単一図)')
axs[0, 0].boxplot(
    dataset_1,
    labels=['Data 1'],
)

# グラフ (0, 1)
axs[0, 1].set_title('カスタマイズ (単一図)')
parts_01 = axs[0, 1].boxplot(
    dataset_1,
    labels=['Data 1'],
    notch=True,
    patch_artist=True,
    showmeans=True,  # 平均値の表示有無
)
parts_01['boxes'][0].set_alpha(0.2)
parts_01['boxes'][0].set_facecolor('green')

# グラフ (1, 0)
axs[1, 0].set_title('デフォルト (複数図)')
axs[1, 0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
)

# グラフ (1, 1)
axs[1, 1].set_title('カスタマイズ (複数図)')
parts_11 = axs[1, 1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data 0', 'Data 1', 'Data 2'],
    notch=True,  # ノッチ有無
    conf_intervals=[[25, 35], [45, 55], [65, 75]],

    # ボックス
    widths=0.8,  # ボックス幅
    patch_artist=True,  # ボックス描画方法
    boxprops={  # ボックススタイル
        'linewidth': 3,
    },
    # 中央値
    medianprops={  # 中央値スタイル
        'color': 'white',
        'linewidth': 3,
    },
    # ひげ
    whiskerprops={  # ひげスタイル
        'color': 'blue',
        'linewidth': 3,
    },
    # キャップ
    capprops={  # キャップスタイル
        'color': 'red',
        'linewidth': 2,
    },
    # 外れ値
    sym='+',  # 外れ値のデフォルト記号
    flierprops={  # 外れ値スタイル
        'markersize': 10,
        'linewidth': 2,
    },
    # 平均値
    showmeans=True,  # 平均値の表示有無
    meanprops={  # 平均値スタイル
        'markerfacecolor': 'cyan',
        'markersize': 10,
        'marker': 'D',
    },
)
# ボックス
parts_11['boxes'][0].set_alpha(0.5)
parts_11['boxes'][0].set_facecolor('red')
parts_11['boxes'][1].set_alpha(0.5)
parts_11['boxes'][1].set_facecolor('green')
parts_11['boxes'][2].set_alpha(0.5)
parts_11['boxes'][2].set_facecolor('blue')
# 外れ値
parts_11['fliers'][0].set_markerfacecolor('red')
parts_11['fliers'][1].set_markerfacecolor('green')
parts_11['fliers'][2].set_markerfacecolor('blue')

# 表示
plt.show()

箱ひげ図【各部分のスタイル等】のサンプル画像


例:関連設定

import matplotlib.pyplot as plt
import numpy as np

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    1, 2,
    figsize=(6, 3),
    tight_layout=True,
)
plt.suptitle('suptitle【タイトル (全体)】')

# データ
rng = np.random.default_rng(12345)
dataset_0 = rng.normal(loc=30, scale=30, size=200).astype(int)
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = rng.normal(loc=50, scale=10, size=200).astype(int)
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = rng.normal(loc=70, scale=10, size=200).astype(int)
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0)
axs[0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data A', 'Data B', 'Data C'],
)
# タイトル 設定
axs[0].set_title('title【タイトル】')
# 軸ラベル 設定
axs[0].set_xlabel('xlabel【x軸ラベル】')
axs[0].set_ylabel('ylabel【y軸ラベル】')
# 範囲 追加
axs[0].axhspan(
    30, 70,
    facecolor='lightyellow',
    edgecolor='blue',
    zorder=0.9
)
# データ上限・下限 設定
axs[0].set_ybound(10, 90)

# グラフ (1)
axs[1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    labels=['Data X', 'Data Y', 'Data Z'],
)
# タイトル 設定
axs[1].set_title('title【タイトル】')
# 軸ラベル 設定
axs[1].set_xlabel('xlabel【x軸ラベル】')
axs[1].set_ylabel('ylabel【y軸ラベル】')
# 水平線 追加
axs[1].axhline(25, linestyle='--', color='red')
axs[1].axhline(50)
axs[1].axhline(75, linestyle='--', color='red')
# 表示範囲 設定
axs[1].set_ylim(-20, 120)

# 表示
plt.show()

箱ひげ図【関連設定】のサンプル画像


axes.Axes.bxp【箱ひげ図 (要約統計量指定)】3.1 / 3.6

メモ

用語

基本

ひげの長さ

値表示

  • 各種値を元に適切な座標に描画

バイオリン図との比較

各部分のスタイル等

関連設定

構文

axes.bxp(
    bxpstats (要約統計量等),
    positions (ボックス位置)=None,
    widths (ボックス幅)=None,
    vert (プロット方向)=True,
    patch_artist (ボックス描画方法)=False,
    shownotches (ノッチ有無)=False,
    showmeans (平均値 表示有無)=False,
    showcaps (キャップ表示有無)=True,
    showbox (ボックス表示有無)=True,
    showfliers (外れ値 表示有無)=True,
    boxprops (ボックス スタイル)=None,
    whiskerprops (ひげスタイル)=None,
    flierprops (外れ値スタイル)=None,
    medianprops (中央値スタイル)=None,
    capprops (キャップ スタイル)=None,
    meanprops (平均値スタイル)=None,
    meanline (平均値ライン表示有無)=False,
    manage_xticksmanage_ticks (目盛り・ラベル位置調整有無)3.1 =True,
    zorder (Zオーダー)=None,
    capwidths (キャップ幅)3.6 =None)

戻り値各箱ひげ図のパーツオブジェクトの dict (下記のキー)
    boxes (list[Line2D] | list[PathPatch])ボックス
    medians (list[Line2D])中央値
    whiskers (list[Line2D])ひげ
    caps (list[Line2D])キャップ
    fliers (list[Line2D])外れ値
    means (list[Line2D])平均値

bxpstats (list(dict))要約統計量等
    必須
    'med' (スカラー)中央値
    'q1' (スカラー)第1四分位点
    'q3' (スカラー)第3四分位点
    'whislo' (スカラー)ひげの下(左)位置
    'whishi' (スカラー)ひげの上(右)位置
    オプション
    'mean' (スカラー)平均値 (showmeans (平均値表示有無)=True で有効)
    'fliers' (配列形式)外れ値 (showfliers (外れ値表示有無)=True で有効)
    'cilo'ノッチの下限 (shownotches (ノッチ有無)=True で有効)
    'cihi'ノッチの上限 (shownotches (ノッチ有無)=True で有効)
    'label' (str)ラベル
positionsボックス位置
widthsボックス幅
vert (bool)プロット方向 (True:垂直方向 / False:水平方向)
patch_artist (bool)ボックス描画方法 (True:Patch【区画】 / False:Line2D【線分】)
    (図形描画で内部の色付け等可)
shownotches (bool)ノッチ有無 (True:ノッチあり / False:ノッチなし)
showmeans (bool)平均値表示有無 (True:表示あり / False:表示なし)
showcaps (bool)キャップ表示有無 (True:表示あり / False:表示なし)
showbox (bool)ボックス表示有無 (True:表示あり / False:表示なし)
showfliers (bool)外れ値表示有無 (True:表示あり / False:表示なし)
boxprops (dict)ボックススタイル
whiskerprops (dict)ひげスタイル
flierprops (dict)外れ値スタイル
medianprops (dict)中央値スタイル
capprops (dict)キャップスタイル
meanprops (dict)平均値スタイル
meanline (bool)平均値ライン表示有無 (True:ライン表示 / False:ポイント表示)
manage_xticks (bool)manage_ticks (bool)3.1目盛り・ラベルの位置調整の有無 (True:位置調整あり / False:位置調整なし)
zorder (float)Zオーダー (省略:2)
capwidths (float | 配列形式)3.6キャップ幅 (デフォルト:ボックス幅の半分)

例:基本

import matplotlib.pyplot as plt

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    1, 2,
    figsize=(6, 3),
    tight_layout=True,
)

# データ
stats_1 = [
    {
        'whishi': 74,
        'q3': 56.0,
        'med': 49.0,
        'q1': 41.0,
        'whislo': 27,
        'fliers': [18, 90],
        'label': 'Data 1',
    }
]
stats_2 = [
    {
        'whishi': 100,
        'q3': 49.25,
        'med': 31.0,
        'q1': 8.0,
        'whislo': 0,
        'fliers': [],
        'label': 'Data 0',
    },
    {
        'whishi': 74,
        'q3': 56.0,
        'med': 49.0,
        'q1': 41.0,
        'whislo': 27,
        'fliers': [18, 90],
        'label': 'Data 1',
    },
    {
        'whishi': 94,
        'q3': 76.0,
        'med': 69.0,
        'q1': 61.75,
        'whislo': 47,
        'fliers': [100],
        'label': 'Data 2',
    }
]

# グラフ (0)
axs[0].set_title('単一図')
axs[0].bxp(stats_1)

# グラフ (1)
axs[1].set_title('複数図')
axs[1].bxp(stats_2)

# 表示
plt.show()

bxp【箱ひげ図 (要約統計量指定)】基本のサンプル画像


例:ひげの長さ

import matplotlib.pyplot as plt

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, ax = plt.subplots(
    1, 1,
    figsize=(3, 3),
    tight_layout=True,
)

# データ
stats = [
    {
        'whishi': 80,
        'q3': 70.0,
        'med': 50.0,
        'q1': 30.0,
        'whislo': 20,
        'fliers': [0, 100],
        'label': 'Data 0',
    },
    {
        'whishi': 100,
        'q3': 70.0,
        'med': 50.0,
        'q1': 30.0,
        'whislo': 0,
        'fliers': [],
        'label': 'Data 1',
    },
]

# グラフ
ax.bxp(stats)

# 表示
plt.show()

bxp【箱ひげ図 (要約統計量指定)】ひげの長さのサンプル画像


例:値表示

import matplotlib.pyplot as plt

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, ax = plt.subplots(
    1, 1,
    figsize=(3, 3),
    tight_layout=True,
)

# データ
stats = [
    {
        'whishi': 80,
        'q3': 70.0,
        'med': 50.0,
        'q1': 30.0,
        'whislo': 20,
        'fliers': [0, 100],
        'label': 'Data 0',
    },
    {
        'whishi': 100,
        'q3': 70.0,
        'med': 50.0,
        'q1': 30.0,
        'whislo': 0,
        'fliers': [],
        'label': 'Data 1',
    },
]

# グラフ
ax.set_title('値表示')
ax.bxp(stats)

# 値表示
fontdict = {
    'size': 10,
    'weight': 'bold',
    'color': 'red',
    'ha': 'left',
    'va': 'center',
}
for i in range(len(stats)):
    x = 1.2 + i
    # 最大値
    ax.text(
        x, stats[i]['whishi'],
        f'{stats[i]["whishi"]}',
        fontdict,
    )
    # Q3【第3四分位点】
    ax.text(
        x, stats[i]['q3'],
        f'{stats[i]["q3"]}',
        fontdict,
    )
    # median【中央値】
    ax.text(
        x, stats[i]['med'],
        f'{stats[i]["med"]}',
        fontdict,
    )
    # Q1【第1四分位点】
    ax.text(
        x, stats[i]['q1'],
        f'{stats[i]["q1"]}',
        fontdict,
    )
    # 最小値
    ax.text(
        x, stats[i]['whislo'],
        f'{stats[i]["whislo"]}',
        fontdict,
    )
    # 外れ値
    for j in range(len(stats[i]['fliers'])):
        ax.text(
            x, stats[i]['fliers'][j],
            f'{stats[i]["fliers"][j]}',
            fontdict,
        )

# 表示
plt.show()

bxp【箱ひげ図 (要約統計量指定)】値表示のサンプル画像


例:各部分のスタイル等

import matplotlib.pyplot as plt

# 初期設定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = \
    ['Yu Gothic', 'Hiragino Maru Gothic Pro', 'Noto Sans CJK JP']
fig, axs = plt.subplots(
    1, 2,
    figsize=(6, 3),
    tight_layout=True,
)

# データ
stats = [
    {
        'whishi': 100,
        'q3': 49.25,
        'med': 31.0,
        'mean': 32.07,
        'q1': 8.0,
        'whislo': 0,
        'fliers': [],
        'label': 'Data 0',
    },
    {
        'whishi': 74,
        'q3': 56.0,
        'med': 49.0,
        'mean': 49.015,
        'q1': 41.0,
        'whislo': 27,
        'fliers': [0, 10],
        'label': 'Data 1',
    },
    {
        'whishi': 94,
        'q3': 76.0,
        'med': 69.0,
        'mean': 69.39,
        'q1': 61.75,
        'whislo': 47,
        'fliers': [100],
        'label': 'Data 2',
    },
]

# グラフ (0)
axs[0].set_title('デフォルト')
axs[0].bxp(
    stats,
)

# グラフ (1)
axs[1].set_title('カスタマイズ')
parts = axs[1].bxp(
    stats,
    # ボックス
    widths=0.6,  # ボックス幅
    patch_artist=True,  # ボックス描画方法
    boxprops={  # ボックススタイル
        'linewidth': 2,
    },
    # 中央値
    medianprops={  # 中央値スタイル
        'color': 'white',
        'linewidth': 2,
    },
    # ひげ
    whiskerprops={  # ひげスタイル
        'color': 'blue',
        'linewidth': 2,
    },
    # キャップ
    capprops={  # キャップスタイル
        'color': 'red',
        'linewidth': 2,
    },
    # 外れ値
    flierprops={  # 外れ値スタイル
        'markersize': 10,
        'linewidth': 2,
        'marker': '+',
    },
    # 平均値
    showmeans=True,  # 平均値の表示有無
    meanprops={  # 平均値スタイル
        'markerfacecolor': 'cyan',
        'markersize': 8,
        'marker': 'D',
    },
)
# ボックス
parts['boxes'][0].set_alpha(0.5)
parts['boxes'][0].set_facecolor('red')
parts['boxes'][1].set_alpha(0.5)
parts['boxes'][1].set_facecolor('green')
parts['boxes'][2].set_alpha(0.5)
parts['boxes'][2].set_facecolor('blue')
# 外れ値
parts['fliers'][0].set_markeredgecolor('red')
parts['fliers'][1].set_markeredgecolor('green')
parts['fliers'][2].set_markeredgecolor('blue')

# 表示
plt.show()

bxp【箱ひげ図 (要約統計量指定)】各部分のスタイル等のサンプル画像