You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Seaborn拆分小提琴图中同时显示两个数据集的箱线图?

解决Seaborn拆分小提琴图箱线图缺失的问题

哈哈,这个问题我之前也踩过坑!Seaborn的split小提琴图确实有这个小局限——当你设置split=True时,默认的箱线图只会显示一个,而且根本分不清对应哪组数据,挺闹心的。不过不用急,有两种办法可以解决,要么继续用Seaborn手动补全箱线图,要么换个工具包更省心。

方法一:用Seaborn手动叠加箱线图

核心思路是:先画好拆分的小提琴图,然后分别为两个数据集单独绘制箱线图,调整它们的位置和宽度,让它们刚好对应各自的小提琴区域。

举个具体的例子,用Seaborn自带的tips数据集演示:

import seaborn as sns
import matplotlib.pyplot as plt

# 加载示例数据
tips = sns.load_dataset("tips")

# 第一步:绘制拆分小提琴图,关闭默认内部元素(避免和手动加的箱线图冲突)
sns.violinplot(
    x="day",
    y="total_bill",
    hue="sex",
    data=tips,
    split=True,
    palette={"Male": "skyblue", "Female": "pink"},
    inner=None  # 关闭默认的内部箱线/散点
)

# 第二步:为Male数据集绘制箱线图,调整位置到小提琴左侧
sns.boxplot(
    x="day",
    y="total_bill",
    data=tips[tips["sex"] == "Male"],
    width=0.2,  # 缩小箱线图宽度,避免重叠
    position=-0.2,  # 向左偏移,对应小提琴左侧
    boxprops={"facecolor": "none", "edgecolor": "black"},  # 透明填充,黑色边框
    showcaps=False,  # 隐藏箱线图的上下帽线(可选,让画面更简洁)
    whiskerprops={"color": "black"},
    capprops={"color": "black"},
    medianprops={"color": "red"}  # 中位数用红色突出显示
)

# 第三步:为Female数据集绘制箱线图,调整位置到小提琴右侧
sns.boxplot(
    x="day",
    y="total_bill",
    data=tips[tips["sex"] == "Female"],
    width=0.2,
    position=0.2,  # 向右偏移,对应小提琴右侧
    boxprops={"facecolor": "none", "edgecolor": "black"},
    showcaps=False,
    whiskerprops={"color": "black"},
    capprops={"color": "black"},
    medianprops={"color": "red"}
)

# 调整图例和标题
plt.legend(title="Sex")
plt.title("Split Violin Plot with Dual Boxplots")
plt.show()

这样就能得到左右两侧各自对应数据集的箱线图,完美匹配拆分小提琴的布局。

方法二:换用Plotly快速实现

如果觉得手动调整位置太麻烦,Plotly是个更省心的选择——它的小提琴图原生支持split参数,并且会自动为两组数据分别绘制箱线图,代码也更简洁:

import plotly.express as px

tips = px.data.tips()

# 一行代码搞定拆分小提琴+双箱线图
fig = px.violin(
    tips,
    x="day",
    y="total_bill",
    color="sex",
    split=True,
    box=True,  # 开启箱线图显示
    color_discrete_map={"Male": "skyblue", "Female": "pink"}
)

fig.update_layout(title="Split Violin Plot with Dual Boxplots")
fig.show()

而且Plotly的图是交互式的,鼠标悬停还能查看具体数据,体验更好。

总结

  • 如果你想继续用Seaborn,手动叠加箱线图的方法完全可行,就是需要多几步调整;
  • 如果你追求效率和交互性,Plotly能一步到位解决问题,不用纠结位置调整。

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

火山引擎 最新活动