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

如何在Python的Seaborn库中创建拆分式分组小提琴图?

实现拆分式分组小提琴图(合并Col-1和Col-2到同一图)

我来帮你搞定这个合并拆分小提琴图的需求!你想要的这种每个Type对应一个小提琴、左右分别展示Col-1和Col-2分布的效果,核心是先把宽格式数据转成seaborn更友好的长格式,再利用hue和split参数实现拆分。

先提一句你原代码的小问题:里面写的x='type'应该改成x='Type'(和你的df列名大小写一致),不然会报错哦。不过我们直接重构代码来实现目标:

步骤1:重塑数据格式

首先要用pandas.melt把宽数据转成长数据,让Col-1和Col-2变成一个分类变量,所有数值统一放在一列,方便seaborn做分组可视化。

步骤2:绘制拆分小提琴图

用seaborn.violinplot,设置x='Type'按A/B分组,y='value'对应数值轴,hue='variable'区分Col-1和Col-2,再加上split=True,就能让每个Type的小提琴按hue拆分左右了。

完整代码示例

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 你的原始数据
data = {
    'Type': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
    'Col-1': [3,4,5,6,7,4,2,6,4,5],
    'Col-2': [8,7,9,6,7,8,7,6,9,7]
}
df = pd.DataFrame(data)

# 1. 把宽格式数据重塑为长格式
melted_df = pd.melt(df, id_vars='Type', var_name='Column', value_name='Value')

# 2. 绘制拆分式小提琴图
plt.figure(figsize=(8, 6))
ax = sns.violinplot(
    data=melted_df,
    x='Type',       # 按Type A/B分组展示
    y='Value',      # 数值轴对应数据值
    hue='Column',   # 用Col-1/Col-2做区分
    split=True,     # 将小提琴拆分为左右两部分,分别对应不同hue类别
    inner='quart'   # 保留你原来的设置,显示四分位数线
)

# 调整图表细节,提升可读性
ax.set_title('Split Violin Plot: Col-1 vs Col-2 by Type')
ax.set_ylabel('Value')
ax.set_xlabel('Type')
# 把图例放到图表外侧,避免遮挡小提琴
plt.legend(title='Columns', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()  # 自动调整布局,防止元素被截断
plt.show()

代码关键点解释

  • pd.melt:把原来的Col-1和Col-2列转化为Column列的两个类别('Col-1'和'Col-2'),所有数值统一存入Value列,这种长数据结构是seaborn分组可视化的标准输入格式。
  • split=True:这是实现“左右拆分”的核心参数,它会让同一x分组下的不同hue类别共享同一个小提琴的左右两侧,完美匹配你的需求。
  • inner='quart':保留了你原代码的设置,在小提琴内部展示四分位数线,能更清晰地呈现数据分布的统计特征。

运行这段代码后,你就能得到一个单一的图表:里面有两个小提琴(对应Type A和B),每个小提琴都拆分为左右两部分,分别对应Col-1和Col-2的数据分布。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:02:34