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

如何在Seaborn分组拆分小提琴图中偏移四分位数与中位数线?

解决拆分小提琴图内部线条偏移问题

你只调整了小提琴的多边形主体位置,但内部的四分位数和中位数线条还留在原坐标上,只需同步调整这些线条的x轴位置即可。

Seaborn用inner="quart"生成的内部线条都存储在ax.lines列表中,每个小提琴对应3条线(下四分位、中位数、上四分位),且顺序和ax.collections里的小提琴主体(PolyCollection)一一对应。我们可以在移动小提琴主体的同时,找到对应线条并偏移它们的x坐标:

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

sns.set_theme(style="whitegrid")

tips = sns.load_dataset("tips")

fig, ax = plt.subplots()
sns.violinplot(
    data=tips, x="day", y="total_bill", hue="smoker", split=True, inner="quart", linewidth=1,
    palette={"Yes": "b", "No": ".85"}, ax=ax
)
sns.despine(left=True)
delta = 0.025

# 遍历小提琴主体,同时同步调整对应内部线条
for ii, item in enumerate(ax.collections):
    if isinstance(item, matplotlib.collections.PolyCollection):
        # 调整小提琴多边形位置
        path, = item.get_paths()
        vertices = path.vertices
        if ii % 2:  # 奇数索引对应右侧小提琴,向右偏移
            vertices[:, 0] += delta
        else:  # 偶数索引对应左侧小提琴,向左偏移
            vertices[:, 0] -= delta
        
        # 调整当前小提琴对应的3条内部线条
        for line_idx in range(ii * 3, ii * 3 + 3):
            line = ax.lines[line_idx]
            x_data = line.get_xdata()
            if ii % 2:
                line.set_xdata(x_data + delta)
            else:
                line.set_xdata(x_data - delta)

plt.show()

关键说明:

  • 每个小提琴主体(PolyCollection)对应ax.lines里连续的3条线,所以用ii*3到ii*3+2的索引范围定位对应线条
  • 按照小提琴的偏移方向(左/右),给线条的x数据加上或减去相同的delta值,保证线条和小提琴主体对齐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:10:28