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

箱ひげ図のサンプル

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

メモ

用語

箱ひげ図の用語
用語備考
最大値データの最大値 (外れ値を除く)
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 (プロット方向)3.10 (仮)3.113.13 =None,
    orientation (プロット方向)3.10 ='vertical',
    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 (目盛りラベル)3.93.11 =None,
    tick_labels (目盛りラベル)3.9 =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,
    label (凡例ラベル)3.9 =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)ノッチ有無 (rcParams["boxplot.notch"] / True:ノッチあり / False:ノッチなし)
sym (str)外れ値デフォルト記号 (マーカー定義マーカースタイルflierprops (外れ値スタイル)も参照)
    省略:中抜き円
vert (bool)3.10 (仮)3.113.13プロット方向 (rcParams["boxplot.vertical"] / True:垂直方向 / False:水平方向)
orientation3.10プロット方向
    'horizontal'水平方向
    'vertical' | その他垂直方向
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)ボックス描画方法 (rcParams["boxplot.patchartist"] / True:Patch【区画】 / False:Line2D【線分】)
    (Patch【区画】は内部の色付け等可)
bootstrap (int)ブートストラップ回数 (中央値の計算で使用)
    Noneガウス ベースの漸近近似で計算
    その他95%の信頼区間の決定回数 (1000〜10000 を推奨)
usermedians (1次元配列形式)中央値指定 (None:自動計算 / その他:指定中央値を使用)
conf_intervals (2次元配列形式)ノッチ位置 (None:自動計算 / :ノッチ位置)
meanline (bool)平均値ライン表示有無 (rcParams["boxplot.meanline"] / True:ライン表示 / False:ポイント表示) showmeans
showmeans (bool)平均値表示有無 (rcParams["boxplot.showmeans"] / True:表示あり / False:表示なし)
showcaps (bool)キャップ表示有無 (rcParams["boxplot.showcaps"] / True:表示あり / False:表示なし)
showbox (bool)ボックス表示有無 (rcParams["boxplot.showbox"] / True:表示あり / False:表示なし)
showfliers (bool)外れ値表示有無 (rcParams["boxplot.showfliers"] / True:表示あり / False:表示なし)
boxprops (dict)ボックス スタイル
labels (シーケンス)3.93.11目盛りラベル (ボックス数分)
tick_labels (list[str])3.9目盛りラベル (ボックス数分)
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キャップ幅
label (str | list[str])3.9凡例ラベル
    凡例ハンドル(シンボル)
        デフォルト中央線
        patch_artist (ボックス描画方法)=Trueボックス
以降はキーワード引数
data (インデックス可能オブジェクト)ラベル名指定データ
各引数にラベル名を指定し、ラベル名と実際の値をここで指定 (全ての引数が対象)

設定・グラフパーツ

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

pyplot.axes.Axes.その他
タイトルsuptitle【タイトル設定 (全体)】
title【タイトル設定】
set_title【タイトル設定】
get_title【タイトル取得】
Axes3D.set_title【タイトル設定】
figure.Figure.suptitle【タイトル設定 (全体)】
figure.SubFigure.suptitle
figure.Figure.align_titles【タイトル調整】3.9
軸ラベル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軸ラベル 取得】
align_labels【ラベル調整】
figure.Figure.supxlabel【x軸ラベル(全体) 設定】3.43.6
figure.Figure.supylabel【y軸ラベル(全体) 設定】3.43.6
figure.SubFigure.supxlabel
figure.SubFigure.supylabel
projections.polar.PolarAxes.set_rlabel_position【半径ラベルのシータ位置設定】
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【水平線 (単一)】3.9
axvline【垂直線 (単一)】
hlines【水平線 (複数)】3.3
vlines【垂直線 (複数)】3.3
axhspan【水平範囲】3.9
axvspan【垂直範囲】3.9
axline【直線】3.3

例:基本 (axes.Axes.boxplot)

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'],  # [~3.8]
    tick_labels=['Data 1'],  # [3.9~]
)

# グラフ (0, 1)
axs[0, 1].set_title('通常データ指定 (複数図)')
axs[0, 1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    # vert=True,  # 省略可 [~3.9]
    orientation='vertical',  # 省略可 [3.10~]
    # labels=['Data 0', 'Data 1', 'Data 2'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
)

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

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

# 表示
plt.show()

例:基本 (pyplot.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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
)

# 表示
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(
    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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
)

# グラフ (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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data'],  # [3.9~]
    autorange=False,
)

# グラフ (2, 1)
axs[2, 1].set_title('autorange=True')
axs[2, 1].boxplot(
    data_edge,
    # labels=['Data'],  # [~3.8]
    tick_labels=['Data'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data 1'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
)
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'],  # [~3.8]
    tick_labels=['Data 1'],  # [3.9~]
)

# グラフ (0, 1)
axs[0, 1].set_title('カスタマイズ (単一図)')
parts_01 = axs[0, 1].boxplot(
    dataset_1,
    # labels=['Data 1'],  # [~3.8]
    tick_labels=['Data 1'],  # [3.9~]
    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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
)

# グラフ (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'],  # [~3.8]
    tick_labels=['Data 0', 'Data 1', 'Data 2'],  # [3.9~]
    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(
    2, 2,
    figsize=(6, 6),
    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, 0)
axs[0, 0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    # labels=['Data A', 'Data B', 'Data C'],  # [~3.8]
    tick_labels=['Data A', 'Data B', 'Data C'],  # [3.9~]
)
# タイトル 設定
axs[0, 0].set_title('title【タイトル】')
# 軸ラベル 設定
axs[0, 0].set_xlabel('xlabel【x軸ラベル】')
axs[0, 0].set_ylabel('ylabel【y軸ラベル】')
# 範囲 追加
axs[0, 0].axhspan(
    30, 70,
    facecolor='lightyellow',
    edgecolor='blue',
    zorder=0.9
)
# データ上限・下限 設定
axs[0, 0].set_ybound(10, 90)

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

# グラフ (1, 0)
parts = axs[1, 0].boxplot(
    [dataset_0, dataset_1, dataset_2],
    patch_artist=True,  # ボックス描画方法
    tick_labels=['Data x', 'Data y', 'Data z'],  # [3.9~]
    label=['R', 'G', 'B'],  # [3.9~]
)
# タイトル 設定
axs[1, 0].set_title('凡例付き (1/2)')
# ボックス色付け
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')
# 凡例
axs[1, 0].legend()

# グラフ (1, 1)
axs[1, 1].boxplot(
    [dataset_0, dataset_1, dataset_2],
    positions=[1, 5, 9],
    widths=1.0,
    patch_artist=True,  # ボックス描画方法
    boxprops={
        'alpha': 0.5,
        'facecolor': 'red',
    },
    label='R',  # [3.9~]
)
axs[1, 1].boxplot(
    [dataset_1, dataset_1, dataset_1],
    positions=[2, 6, 10],
    widths=1.0,
    patch_artist=True,  # ボックス描画方法
    boxprops={
        'alpha': 0.5,
        'facecolor': 'green',
    },
    label='G',  # [3.9~]
)
axs[1, 1].boxplot(
    [dataset_2, dataset_1, dataset_0],
    positions=[3, 7, 11],
    widths=1.0,
    patch_artist=True,  # ボックス描画方法
    boxprops={
        'alpha': 0.5,
        'facecolor': 'blue',
    },
    label='B',  # [3.9~]
)
# 表示範囲 設定
axs[1, 1].set_xlim(0, 12)
axs[1, 1].set_ylim(-10, 140)
# タイトル 設定
axs[1, 1].set_title('凡例付き (2/2)')
# x軸目盛り 設定
axs[1, 1].set_xticks(
    [2, 6, 10],
    ['Data x', 'Data y', 'Data z'],
)
# 凡例
axs[1, 1].legend()

# 表示
plt.show()

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

メモ

用語

基本

ひげの長さ

値表示

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

バイオリン図との比較

各部分のスタイル等

関連設定

構文

axes.bxp(
    bxpstats (要約統計量等),
    positions (ボックス位置)=None,
    widths (ボックス幅)=None,
    vert (プロット方向)3.10 (仮)3.113.13 =True,
    orientation (プロット方向)3.10 ='vertical',
    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,
    label (凡例ラベル)3.9 =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)3.10 (仮)3.113.13プロット方向 (True:垂直方向 / False:水平方向)
orientation3.10プロット方向
    'horizontal'水平方向
    'vertical' | その他垂直方向
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キャップ幅 (デフォルト:ボックス幅の半分)
label (str | list[str])3.9凡例ラベル
    凡例ハンドル(シンボル)
        デフォルト中央線
        patch_artist (ボックス描画方法)=Trueボックス

例:基本

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_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.set_title('ひげの長さ')
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【箱ひげ図 (要約統計量指定)】凡例のサンプル画像

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_a = {
    'whishi': 100,
    'q3': 49.25,
    'med': 31.0,
    'q1': 8.0,
    'whislo': 0,
    'fliers': [],
}
stats_b = {
    'whishi': 74,
    'q3': 56.0,
    'med': 49.0,
    'q1': 41.0,
    'whislo': 27,
    'fliers': [18, 90],
}
stats_c = {
    'whishi': 94,
    'q3': 76.0,
    'med': 69.0,
    'q1': 61.75,
    'whislo': 47,
    'fliers': [100],
}

# グラフ (0)
parts = axs[0].bxp(
    [stats_a, stats_b, stats_c],
    patch_artist=True,  # ボックス描画方法
    label=['R', 'G', 'B'],  # [3.9~]
)
# ボックス色付け
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')
# x軸目盛り 設定
axs[0].set_xticks(
    [1, 2, 3],
    ['Data x', 'Data y', 'Data z'],
)
# 凡例
axs[0].legend()

# グラフ (1)
axs[1].bxp(
    [stats_a, stats_b, stats_c],
    positions=[1, 5, 9],
    widths=1.0,
    patch_artist=True,  # ボックス描画方法
    boxprops={
        'alpha': 0.5,
        'facecolor': 'red',
    },
    label='R',  # [3.9~]
)
axs[1].bxp(
    [stats_b, stats_b, stats_b],
    positions=[2, 6, 10],
    widths=1.0,
    patch_artist=True,  # ボックス描画方法
    boxprops={
        'alpha': 0.5,
        'facecolor': 'green',
    },
    label='G',  # [3.9~]
)
axs[1].bxp(
    [stats_c, stats_b, stats_a],
    positions=[3, 7, 11],
    widths=1.0,
    patch_artist=True,  # ボックス描画方法
    boxprops={
        'alpha': 0.5,
        'facecolor': 'blue',
    },
    label='B',  # [3.9~]
)
# 表示範囲 設定
axs[1].set_xlim(0, 12)
axs[1].set_ylim(-10, 140)
# x軸目盛り 設定
axs[1].set_xticks(
    [2, 6, 10],
    ['Data x', 'Data y', 'Data z'],
)
# 凡例
axs[1].legend()

# 表示
plt.show()