You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib同一坐标轴绘制多类别对应的小提琴图

在同一Matplotlib坐标轴上绘制多类别小提琴图

实现思路

直接提取每个类别对应的Score数据,将所有类别数据传入violinplot函数,即可在同一坐标轴上完成多组小提琴图的绘制,无需拆分多个子图。

完整代码示例

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 构造示例数据(与你的数据集结构匹配)
np.random.seed(42)
data = {
    'Score': np.random.normal(loc=50, scale=15, size=200),
    'Cat A': np.random.randint(0, 2, size=200),
    'Cat B': np.random.randint(0, 2, size=200),
    'Cat C': np.random.randint(0, 2, size=200)
}
df = pd.DataFrame(data)

# 收集每个类别对应的Score数据
category_names = ['Cat A', 'Cat B', 'Cat C']
category_scores = [df[df[cat] == 1]['Score'].values for cat in category_names]

# 绘制小提琴图
fig, ax = plt.subplots(figsize=(8, 6))
# 传入多类别数据,设置显示中位数、调整宽度避免重叠
violins = ax.violinplot(category_scores, showmedians=True, widths=0.5)

# 配置坐标轴与标签
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(category_names)
ax.set_title('Score Distribution by Category')
ax.set_xlabel('Category')
ax.set_ylabel('Score')

# 可选:自定义小提琴图颜色
colors = ['#FF9999', '#66B3FF', '#99FF99']
for idx, pc in enumerate(violins['bodies']):
    pc.set_facecolor(colors[idx])
    pc.set_alpha(0.7)

plt.tight_layout()
plt.show()

关键说明

  1. 数据提取:通过列表推导式快速筛选每个类别下的Score数据,生成包含多组数据的列表。
  2. 核心绘制:violinplot支持直接传入多组数据,自动在同一坐标轴上按顺序绘制对应小提琴图。
  3. 优化调整:通过widths参数调整小提琴图宽度,避免多组图重叠;showmedians参数可显示中位数,更直观展示分布中心。

内容的提问来源于stack exchange,提问作者ldb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:00:51