バイオリン図
violinplot【バイオリン図 (データ指定)】
violin【バイオリン図 (データ分布指定)】

バイオリン図

axes.Axes.violinplot【バイオリン図 (データ指定)】3.2
pyplot.violinplot【バイオリン図 (データ指定)】3.2

メモ

基本

例:axes.Axes.violinplot 〕〔 例:pyplot.violinplot

カスタマイズ

関連設定

構文

axes.violinplot(
    dataset (データ / データキー),
    positions (各図の位置)=None,
    vert (プロット方向)=True,
    widths (最大幅)=0.5,
    showmeans (平均値の表示有無)=False,
    showextrema (最大値・最小値の表示有無)=True,
    showmedians (中央値の表示有無)=False,
    quantiles (レンダリング分位値)=None, 3.2
    points (評価ポイント数)=100,
    bw_method (推定帯域幅の計算方法)=None,
    *,
    data (キー付きデータ)=None)
pyplot.violinplot(同上)
戻り値 (dict)各コンポーネント (キーは以下参照:表示ありで有効)
    bodies (PolyCollection)本体領域
    cmeans (LineCollection)平均値の線分
    cmins (LineCollection)最小値の線分
    cmaxes (LineCollection)最大値の線分
    cbars (LineCollection)中心線の線分
    cmedians (LineCollection)中央値の線分
    cquantiles (LineCollection)分位値の線分

dataset (配列 | ベクトルのシーケンス | 文字列)データ / データキー
    ベクトルのシーケンス単一図
    2次元配列複数図
    文字列data (キー付きデータ)の対応キー
positions (配列形式)各図の位置 (省略:[1, 2, …, n])
vert (bool)プロット方向 (True:垂直方向 / False:水平方向)
widths (スカラー | 配列形式)各図の最大幅 (重ならない最大幅:1.0)
showmeans (bool)平均値の表示有無 (True:表示 / False:非表示)
showextrema (bool)最大値・最小値の表示有無 (True:表示 / False:非表示)
showmedians (bool)中央値の表示有無 (True:表示 / False:非表示)
quantiles (配列形式)3.2レンダリング分位値 (値:0.0~1.0)
points (int)各ガウスカーネル密度推定の評価ポイント数
bw_method (str | スカラー | 呼出し可)推定帯域幅の計算方法
    'scott'スコットの方法
    'silverman'シルバーマンの方法
    スカラー定数使用
    呼出し可使用関数 (引数:mlab.GaussianKDEのインスタンス / 戻り値:スカラー)
以降はキーワード引数
data (インデックス可能オブジェクト)キー付きデータ
    dataset (データ / データキー)に対応データキーを指定

設定・グラフパーツ

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

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.violinplot)

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 = np.r_[
    rng.normal(loc=25, scale=10, size=100).astype(int),
    rng.normal(loc=75, scale=10, size=300).astype(int),
]
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = np.r_[
    rng.normal(loc=25, scale=10, size=200).astype(int),
    rng.normal(loc=75, scale=10, size=200).astype(int),
]
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = np.r_[
    rng.normal(loc=25, scale=10, size=300).astype(int),
    rng.normal(loc=75, scale=10, size=100).astype(int),
]
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0, 0)
axs[0, 0].set_title('データ指定 (単一図)')
axs[0, 0].violinplot(
    dataset_1,
)
axs[0, 0].set_xticks([1], ['Data 1'])

# グラフ (0, 1)
axs[0, 1].set_title('データ指定 (複数図)')
axs[0, 1].violinplot(
    [dataset_0, dataset_1, dataset_2],
)
axs[0, 1].set_xticks(
    [1, 2, 3],
    ['Data 0', 'Data 1', 'Data 2'],
)

# グラフ (1, 0)
axs[1, 0].set_title('データキー指定')
axs[1, 0].violinplot(
    'DATA_1',
    data={
        'DATA_0': dataset_0,
        'DATA_1': dataset_1,
        'DATA_2': dataset_2,
    },
)
axs[1, 0].set_xticks([1], ['Data 1'])

# グラフ (1, 1)
axs[1, 1].set_title('データ指定 (複数図・水平方向)')
axs[1, 1].violinplot(
    [dataset_0, dataset_1, dataset_2],
    vert=False,
)
axs[1, 1].set_yticks(
    [1, 2, 3],
    ['Data 0', 'Data 1', 'Data 2'],
)

# 表示
plt.show()

violinplotのサンプル画像


例:基本 (pyplot.violinplot)

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 = np.r_[
    rng.normal(loc=25, scale=10, size=100).astype(int),
    rng.normal(loc=75, scale=10, size=300).astype(int),
]
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = np.r_[
    rng.normal(loc=25, scale=10, size=200).astype(int),
    rng.normal(loc=75, scale=10, size=200).astype(int),
]
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = np.r_[
    rng.normal(loc=25, scale=10, size=300).astype(int),
    rng.normal(loc=75, scale=10, size=100).astype(int),
]
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0, 1)
plt.title('pyplot.violinplot\n【バイオリン図 (データ指定)】')
plt.violinplot(
    [dataset_0, dataset_1, dataset_2],
)
plt.xticks(
    [1, 2, 3],
    ['Data 0', 'Data 1', 'Data 2'],
)

# 表示
plt.show()

violinplotのサンプル画像


例:カスタマイズ

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 = np.r_[
    rng.normal(loc=25, scale=10, size=100).astype(int),
    rng.normal(loc=75, scale=10, size=300).astype(int),
]
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = np.r_[
    rng.normal(loc=25, scale=10, size=200).astype(int),
    rng.normal(loc=75, scale=10, size=200).astype(int),
]
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = np.r_[
    rng.normal(loc=25, scale=10, size=300).astype(int),
    rng.normal(loc=75, scale=10, size=100).astype(int),
]
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0, 0)
axs[0, 0].set_title('デフォルト (単一図)')
axs[0, 0].violinplot(
    dataset_1,
)

# グラフ (0, 1)
axs[0, 1].set_title('カスタマイズ (単一図)')
parts_01 = axs[0, 1].violinplot(
    dataset_1,
    widths=1.0,
    showmeans=True,
    showextrema=True,
    showmedians=True,
    quantiles=[0.25, 0.75],  # 説明用の値
)
axs[0, 1].set_xlim(0, 2)
axs[0, 1].set_xticks([1], ['Data 1'])
# 本体領域
print(parts_01['bodies'][0].get_alpha())
# 出力:0.3
parts_01['bodies'][0].set_alpha(1)
parts_01['bodies'][0].set_facecolor('lightgreen')
parts_01['bodies'][0].set_edgecolor('black')
parts_01['bodies'][0].set_linewidth(2)
# 平均値の線分
parts_01['cmeans'].set_color('red')
parts_01['cmeans'].set_linewidth(3)
# 最小値の線分
parts_01['cmins'].set_color('orange')
parts_01['cmins'].set_linewidth(3)
# 最大値の線分
parts_01['cmaxes'].set_color('orange')
parts_01['cmaxes'].set_linewidth(3)
# 中心線の線分
parts_01['cbars'].set_colors('green')
parts_01['cbars'].set_linewidth(3)
# 中央値の線分
parts_01['cmedians'].set_color('cyan')
parts_01['cmedians'].set_linewidth(3)
# 分位値の線分
parts_01['cquantiles'].set_color('white')
parts_01['cquantiles'].set_linewidth(3)

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

# グラフ (1, 1)
axs[1, 1].set_title('カスタマイズ (複数図)')
parts_11 = axs[1, 1].violinplot(
    [dataset_0, dataset_1, dataset_2],
    widths=0.9,
    showmeans=True,
    showextrema=True,
    showmedians=True,
    quantiles=[[0.25, 0.75], [0.25, 0.75], [0.25, 0.75]],  # 説明用の値
)
axs[1, 1].set_xticks(
    [1, 2, 3],
    ['Data 0', 'Data 1', 'Data 2'],
)

# 本体領域
print(parts_11['bodies'][0].get_alpha())
# 出力:0.3
# parts_11['bodies'][0].set_alpha(1)
parts_11['bodies'][0].set_facecolor('red')
parts_11['bodies'][0].set_edgecolor('cyan')
parts_11['bodies'][0].set_linewidth(5)
# parts_11['bodies'][1].set_alpha(1)
parts_11['bodies'][1].set_facecolor('green')
parts_11['bodies'][1].set_edgecolor('cyan')
parts_11['bodies'][1].set_linewidth(5)
# parts_11['bodies'][2].set_alpha(1)
parts_11['bodies'][2].set_facecolor('blue')
parts_11['bodies'][2].set_edgecolor('cyan')
parts_11['bodies'][2].set_linewidth(5)
# 平均値の線分
parts_11['cmeans'].set_color('red')
parts_11['cmeans'].set_linewidth(2)
# 最小値の線分
parts_11['cmins'].set_color('orange')
parts_11['cmins'].set_linewidth(2)
# 最大値の線分
parts_11['cmaxes'].set_color('orange')
parts_11['cmaxes'].set_linewidth(2)
# 中心線の線分
parts_11['cbars'].set_colors(['red', 'green', 'blue'])
parts_11['cbars'].set_linewidth(2)
# 中央値の線分
parts_11['cmedians'].set_color('cyan')
parts_11['cmedians'].set_linewidth(2)
# 分位値の線分
parts_11['cquantiles'].set_color('white')
parts_11['cquantiles'].set_linewidth(2)

# 表示
plt.show()

violinplotのサンプル画像


例:関連設定

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 = np.r_[
    rng.normal(loc=25, scale=10, size=100).astype(int),
    rng.normal(loc=75, scale=10, size=300).astype(int),
]
dataset_0 = np.clip(dataset_0, 0, 100)
dataset_1 = np.r_[
    rng.normal(loc=25, scale=10, size=200).astype(int),
    rng.normal(loc=75, scale=10, size=200).astype(int),
]
dataset_1 = np.clip(dataset_1, 0, 100)
dataset_2 = np.r_[
    rng.normal(loc=25, scale=10, size=300).astype(int),
    rng.normal(loc=75, scale=10, size=100).astype(int),
]
dataset_2 = np.clip(dataset_2, 0, 100)

# グラフ (0)
axs[0].violinplot(
    [dataset_0, dataset_1, dataset_2],
)
# タイトル 設定
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='red',
    zorder=0.9
)
# 目盛り 設定
axs[0].set_xticks(
    [1, 2, 3],
    ['Data A', 'Data B', 'Data C'],
)
# データ上限・下限 設定
axs[0].set_ybound(10, 90)

# グラフ (1)
axs[1].violinplot(
    [dataset_0, dataset_1, dataset_2],
)
# タイトル 設定
axs[1].set_title('title【タイトル】')
# 軸ラベル 設定
axs[1].set_xlabel('xlabel【x軸ラベル】')
axs[1].set_ylabel('ylabel【y軸ラベル】')
# 目盛り 設定
axs[1].set_xticks(
    [1, 2, 3],
    ['Data X', 'Data Y', 'Data Z'],
)
# 水平線 追加
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()

violinplotのサンプル画像


axes.Axes.violin【バイオリン図 (データ分布指定)】3.2

メモ

基本

カスタマイズ

関連設定

例:violinplot【バイオリン図 (データ指定)】

構文

axes.violin(
    vpstats (データ分布),
    positions (各図の位置)=None,
    vert (プロット方向)=True,
    widths (最大幅)=0.5,
    showmeans (平均値の表示有無)=False,
    showextrema (最大値・最小値の表示有無)=True,
    showmedians (中央値の表示有無)=False)

戻り値 (dict)各コンポーネント (キーは以下参照:表示ありで有効)
    bodies (PolyCollection)本体領域
    cmeans (LineCollection)平均値の線分
    cmins (LineCollection)最小値の線分
    cmaxes (LineCollection)最大値の線分
    cbars (LineCollection)中心線の線分
    cmedians (LineCollection)中央値の線分
    cquantiles (LineCollection)分位値の線分

vpstats (list[dict])データ分布
    必須キー
    coordsカーネル密度推定の評価座標のリスト
    valscoordsの各座標でのカーネル密度推定値のリスト
    mean平均値
    median中央値
    min最小値
    max最大値
    任意キー
    quantiles3.2分位値のリスト
positions (配列形式)各図の位置 (省略:[1, 2, …, n])
vert (bool)プロット方向 (True:垂直方向 / False:水平方向)
widths (配列形式)各図の最大幅 (重ならない最大幅:1.0)
showmeans (bool)平均値の表示有無 (True:表示 / False:非表示)
showextrema (bool)最大値・最小値の表示有無 (True:表示 / False:非表示)
showmedians (bool)中央値の表示有無 (True:表示 / False:非表示)

例:基本

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(
    2, 2,
    figsize=(6, 6),
    tight_layout=True,
)

# データ分布
dataset_a = {
    'coords': [~],
    'vals': [~],
    'mean': ~,
    'median': ~,
    'min': ~,
    'max': ~,
}
dataset_b = {
    'coords': [~],
    'vals': [~],
    'mean': ~,
    'median': ~,
    'min': ~,
    'max': ~,
}
dataset_c = {
    'coords': [~],
    'vals': [~],
    'mean': ~,
    'median': ~,
    'min': ~,
    'max': ~,
}
vpstats_1 = [dataset_b]
vpstats_3 = [dataset_a, dataset_b, dataset_c]

# グラフ (0, 0)
axs[0, 0].set_title('単一図・垂直方向')
axs[0, 0].violin(
    vpstats_1,
)
axs[0, 0].set_xticks([1], ['Data B'])

# グラフ (0, 1)
axs[0, 1].set_title('単一図・水平方向')
axs[0, 1].violin(
    vpstats_1,
    vert=False,
)
axs[0, 1].set_yticks([1], ['Data B'])

# グラフ (1, 0)
axs[1, 0].set_title('複数図・垂直方向')
axs[1, 0].violin(
    vpstats_3,
)
axs[1, 0].set_xticks(
    [1, 2, 3],
    ['Data A', 'Data B', 'Data C'],
)

# グラフ (1, 1)
axs[1, 1].set_title('複数図・水平方向')
axs[1, 1].violin(
    vpstats_3,
    vert=False,
)
axs[1, 1].set_yticks(
    [1, 2, 3],
    ['Data A', 'Data B', 'Data C'],
)

# 表示
plt.show()

violinのサンプル画像


例:カスタマイズ

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(
    2, 2,
    figsize=(6, 6),
    tight_layout=True,
)

# データ分布
dataset_a = {
    'coords': [~],
    'vals': [~],
    'mean': ~,
    'median': ~,
    'min': ~,
    'max': ~,
    'quantiles': [25, 75],  # 説明用の値
}
dataset_b = {
    'coords': [~],
    'vals': [~],
    'mean': ~,
    'median': ~,
    'min': ~,
    'max': ~,
    'quantiles': [25, 75],  # 説明用の値
}
dataset_c = {
    'coords': [~],
    'vals': [~],
    'mean': ~,
    'median': ~,
    'min': ~,
    'max': ~,
    'quantiles': [25, 75],  # 説明用の値
}
vpstats_1 = [dataset_b]
vpstats_3 = [dataset_a, dataset_b, dataset_c]

# グラフ (0, 0)
axs[0, 0].set_title('デフォルト (単一図)')
axs[0, 0].violin(
    vpstats_1,
)

# グラフ (0, 1)
axs[0, 1].set_title('カスタマイズ (単一図)')
parts_01 = axs[0, 1].violin(
    vpstats_1,
    widths=1.0,
    showmeans=True,
    showextrema=True,
    showmedians=True,
)
axs[0, 1].set_xlim(0, 2)
axs[0, 1].set_xticks([1], ['Data B'])
# 本体領域
print(parts_01['bodies'][0].get_alpha())
# 出力:0.3
parts_01['bodies'][0].set_alpha(1)
parts_01['bodies'][0].set_facecolor('lightgreen')
parts_01['bodies'][0].set_edgecolor('black')
parts_01['bodies'][0].set_linewidth(2)
# 平均値の線分
parts_01['cmeans'].set_color('red')
parts_01['cmeans'].set_linewidth(2)
# 最小値の線分
parts_01['cmins'].set_color('orange')
parts_01['cmins'].set_linewidth(2)
# 最大値の線分
parts_01['cmaxes'].set_color('orange')
parts_01['cmaxes'].set_linewidth(2)
# 中心線の線分
parts_01['cbars'].set_colors(['green'])
parts_01['cbars'].set_linewidth(2)
# 中央値の線分
parts_01['cmedians'].set_color('cyan')
parts_01['cmedians'].set_linewidth(2)
# 分位値の線分
parts_01['cquantiles'].set_color('white')
parts_01['cquantiles'].set_linewidth(2)

# グラフ (1, 0)
axs[1, 0].set_title('デフォルト (複数図)')
axs[1, 0].violin(
    vpstats_3,
)

# グラフ (1, 1)
axs[1, 1].set_title('カスタマイズ (複数図)')
parts_11 = axs[1, 1].violin(
    vpstats_3,
    widths=0.9,
    showmeans=True,
    showextrema=True,
    showmedians=True,
)
axs[1, 1].set_xticks(
    [1, 2, 3],
    ['Data A', 'Data B', 'Data C'],
)
# 本体領域
parts_11['bodies'][0].set_alpha(1)
parts_11['bodies'][0].set_facecolor('red')
parts_11['bodies'][0].set_edgecolor('black')
parts_11['bodies'][1].set_alpha(1)
parts_11['bodies'][1].set_facecolor('green')
parts_11['bodies'][1].set_edgecolor('black')
parts_11['bodies'][2].set_alpha(1)
parts_11['bodies'][2].set_facecolor('blue')
parts_11['bodies'][2].set_edgecolor('black')
# 平均値の線分
parts_11['cmeans'].set_colors(['blue', 'red', 'red'])
parts_11['cmeans'].set_linewidth(2)
# 最小値の線分
parts_11['cmins'].set_color('orange')
parts_11['cmins'].set_linewidth(2)
# 最大値の線分
parts_11['cmaxes'].set_color('orange')
parts_11['cmaxes'].set_linewidth(2)
# 中心線の線分
parts_11['cbars'].set_colors(['white', 'white', 'white'])
parts_11['cbars'].set_linewidth(2)
# 中央値の線分
parts_11['cmedians'].set_color('cyan')
parts_11['cmedians'].set_linewidth(2)
# 分位値の線分
parts_11['cquantiles'].set_color('white')
parts_11['cquantiles'].set_linewidth(2)

# 表示
plt.show()

violinのサンプル画像