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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:37:22