如何在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()
关键说明
- 数据提取:通过列表推导式快速筛选每个类别下的Score数据,生成包含多组数据的列表。
- 核心绘制:
violinplot支持直接传入多组数据,自动在同一坐标轴上按顺序绘制对应小提琴图。 - 优化调整:通过
widths参数调整小提琴图宽度,避免多组图重叠;showmedians参数可显示中位数,更直观展示分布中心。
内容的提问来源于stack exchange,提问作者ldb
相关产品推荐
相关产品推荐

