箱ひげ図
boxplot【箱ひげ図 (データ指定)】3.1 / 3.2 / 3.4 / 3.6 / 3.93.10
bxp【箱ひげ図 (要約統計量指定)】3.1 / 3.6 / 3.93.10
![箱ひげ図のサンプル](img/graph-boxplot-memo.png)
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
メモ
用語
![箱ひげ図の用語](img/graph-boxplot-memo-term.png)
用語 | 備考 |
---|---|
最大値 | データの最大値 (外れ値を除く) |
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) 〕- データ指定で箱ひげ図を描画
- 要約統計量指定は bxp【箱ひげ図 (要約統計量指定)】
- データの指定方法
- 単一図:x (データ)に1次元配列
- 複数図:x (データ)に2次元配列
- 尚、x (データ)にラベル名を指定し、data (ラベル名指定データ)にデータを指定することも可
- 各図の位置
- デフォルトは、1からの整数値
- 目盛りラベル:labels (目盛りラベル)3.93.11 tick_labels (目盛りラベル)3.9 または set_xticks【x軸目盛り 設定】等
(水平方向プロットは、set_yticks【y軸目盛り 設定】等)
- プロット方向
- vert (プロット方向)3.10 (仮)3.113.13 指定
- orientation (プロット方向)3.10 指定
- 金融で使用されるローソク足は、matplotlib ユーティリティの matplotlib.mplfinance (英語) を参照
ひげの長さ
〔 例 〕- whis (ひげの位置)
- IQRに対する上下限の倍率指定:超えた値は外れ値
ひげ端は外れ値を除く最大値と最大値 - パーセンタイル指定:ひげ端をパーセンタイルで指定
例:
(10, 90):ひげ端は10パーセンタイルと90パーセンタイル
(0, 100):ひげ端は最大値・最大値 (外れ値なし)
- IQRに対する上下限の倍率指定:超えた値は外れ値
- autorange (自動範囲設定 有無)
- 極端なデータ分布 (Q1 == Q3) での扱い
値表示
〔 例 〕- ユーティリティ関数 cbook.boxplot_stats【要約統計量取得 (箱ひげ図)】で各種値を取得
- 取得値を元に適切な座標に描画
バイオリン図との比較
〔 例 〕- データ分布のピークが複数ある (二峰性・多峰性) 場合には不向き
各部分のスタイル等
〔 例 〕- 引数・戻り値で指定
部分 | 関連引数 | 戻り値・備考 |
---|---|---|
ボックス | positions (ボックス位置) widths (ボックス幅) patch_artist (ボックス描画方法) showbox (ボックス表示有無) boxprops (ボックス スタイル) | 'boxes' (ボックス) 色付け:(boxprops (ボックス スタイル)の指定でも可) ・patch_artist (ボックス描画方法)を True (Patch【区画】)に指定 ・set_facecolor【背景色 設定】で色指定 |
中央値 | usermedians (中央値指定) medianprops (中央値スタイル) bootstrap (ブートストラップ回数):中央値の計算で使用 | 'medians' (中央値) |
ノッチ 中央値周辺の信頼区間 (CI) | notch (ノッチ有無) conf_intervals (ノッチ位置) bootstrap (ブートストラップ回数):中央値の計算で使用 | |
ひげ | whis (ひげ位置) whiskerprops (ひげスタイル) | 'whiskers' (ひげ) |
キャップ | showcaps (キャップ表示有無) capprops (キャップ スタイル) capwidths (キャップ幅) 3.6 | 'caps' (キャップ) |
外れ値 | sym (外れ値デフォルト記号) showfliers (外れ値表示有無) flierprops (外れ値スタイル) | 'fliers' (外れ値) |
平均値 | meanline (平均値ライン表示有無) showmeans (平均値表示有無) meanprops (平均値スタイル) | 'means' (平均値) |
関連設定
〔 例 〕- 凡例 3.9
- boxplot【箱ひげ図 (データ指定)】でlabel (凡例ラベル)3.9 指定
- 明確に区別する為、ボックスを色付け
- legend【凡例 設定】
- タイトル・目盛り等:設定・グラフパーツ 参照
関連
外部リンク
構文
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【等高線ラベル 設定】 | |||
表示範囲 | 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)
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)
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
メモ
用語
基本
〔 例 〕- 要約統計量指定で箱ひげ図を描画
- データ指定は boxplot【箱ひげ図 (データ指定)】
- 要約統計量をデータから求めるには、cbook.boxplot_stats を使用
- 要約統計量の指定方法
- 単一図:bxpstats (要約統計量)に単一項目配列
- 複数図:bxpstats (要約統計量)に複数項目配列
- 各図の位置
- デフォルトは、1からの整数値
- bxpstats (要約統計量)のlabel (ラベル)でラベル指定
- プロット方向
- vert (プロット方向)3.10 (仮)3.113.13 指定
- orientation (プロット方向)3.10 指定
ひげの長さ
〔 例 〕値表示
〔 例 〕- 各種値を元に適切な座標に描画
バイオリン図との比較
- データ分布のピークが複数ある (二峰性・多峰性) 場合には不向き
- boxplot【箱ひげ図 (データ指定)】のバイオリン図との比較を参照
各部分のスタイル等
〔 例 〕関連設定
- 凡例 3.9〔 例 〕
- bxp【箱ひげ図 (要約統計量指定)】でlabel (凡例ラベル)3.9 指定
- 明確に区別する為、ボックスを色付け (boxplot【箱ひげ図 (データ指定)】の色付け 参照)
- legend【凡例 設定】
- boxplot【箱ひげ図 (データ指定)】の 関連設定 参照
関連
外部リンク
構文
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ボックス
例:基本
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()
例:ひげの長さ
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()
例:値表示
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()
例:各部分のスタイル等
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()
例:凡例
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()