如何用Seaborn实现同类别并排小提琴图?解决叠加与子图分离问题
解决同一分组下双小提琴图并排对比问题
你当前的代码生成了两个独立子图,无法直接对比同一元素类型下的两种分数。要实现同一x轴(元素类型)下,每个类别旁并排显示两种分数的小提琴图,核心是把数据转换成「长格式」,让Seaborn能自动分组绘制。
修改后的代码:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 将宽格式数据转换为长格式,适配Seaborn分组逻辑 melted_df = pd.melt( df, id_vars=['main_category'], value_vars=['avg_phast_score', 'control_score'], var_name='Score Type', value_name='Score' ) # 创建单个子图,绘制并排小提琴图 plt.figure(figsize=(12, 6)) sns.violinplot( x='main_category', y='Score', hue='Score Type', data=melted_df, split=False, # 保持两个小提琴独立并排,不合并 inner='quartile' # 显示四分位数,提升数据可读性 ) # 调整图表细节 plt.title('Element Type vs Average Phast Score (vs Control)') plt.xlabel('Element Type') plt.ylabel('Average Phast Score') plt.ylim([-0.1, 0.2]) plt.xticks(rotation=90) plt.legend(title='Score Category') plt.tight_layout() plt.show()
关键改动说明:
- 数据格式转换:用
pd.melt把原数据中两个独立的分数列(avg_phast_score、control_score)合并为一列,新增标记列区分分数类型,让Seaborn能识别分组维度。 - 单图分组绘制:在同一个子图中,通过
hue参数指定分数类型,Seaborn会自动在每个main_category下并排绘制对应两种分数的小提琴图,实现直接对比。 - 样式优化:设置
split=False确保两个小提琴独立显示,添加图例明确区分分数类别,统一坐标轴范围让对比更直观。
如果仍需保留双列子图形式,可同步两个子图的x轴刻度与位置,但上述长格式单图方案更适配同组对比的需求。
内容的提问来源于stack exchange,提问作者youtube
相关产品推荐
相关产品推荐

