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

如何确定seaborn violinplot特定y值对应边缘的x坐标以绘制均值线

实现方法

Seaborn绘制的小提琴图本质是Matplotlib的PathPatch对象,存储在sns.violinplot返回对象的collections属性中,我们可以直接提取小提琴轮廓的所有坐标点,计算对应y值(均值)下的x边界:

  1. 提取小提琴轮廓的所有坐标点
  2. 匹配和目标y值(均值)最接近的轮廓点,取对应的x坐标最大值即为边界值
  3. 用得到的x边界绘制横跨小提琴的均值横线
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

data = [2.57e-05, 4.17e-06, -5.4e-06, -5.05e-06, 1.15e-05, -6.7e-06, 1.01e-05, 5.53e-06, 8.13e-06, 1.27e-05, 1.11e-06, -2.87e-06, -1.38e-06, -1.07e-05, -8.04e-06, 4.77e-06, 3.22e-07, 9.86e-06, 1.38e-05, 1.32e-05, -3.48e-06, -4.69e-06, 8.15e-06, 4.21e-07, 2.71e-06, 7.52e-08, 1.04e-06, -1.92e-06, -4.08e-06, 4.76e-06]

vg = sns.violinplot(data=data, inner="quartile", scale="width")
    
a = sns.pointplot(data=data, linestyles='-', join=False, ci=None, color='red')
        
for p in vg.lines:
    p.set_linestyle('-')
    p.set_linewidth(0.8)  # 设置四分位线粗细
    p.set_color('white')  # 设置四分位线颜色
    p.set_alpha(0.8)

for p in vg.lines[1::3]:  # 隐藏默认中位数线
    p.set_linestyle('-')
    p.set_linewidth(0)
    p.set_color('black')
    p.set_alpha(0.8)

# --------------- 自动计算x边界绘制均值横线 ---------------
# 计算均值
mean_val = np.mean(data)
# 提取小提琴轮廓坐标,单组数据取第一个collection,多组可以按索引遍历
violin_patch = vg.collections[0]
path = violin_patch.get_paths()[0]
verts = path.vertices
x_verts = verts[:, 0]
y_verts = verts[:, 1]
# 找到和均值最接近的轮廓点对应的x最大绝对值
idx = np.argmin(np.abs(y_verts - mean_val))
x_bound = np.abs(x_verts[idx])
# 绘制横跨小提琴的均值线
plt.plot([-x_bound, x_bound], [mean_val, mean_val], 'k-', lw=1)
# -------------------------------------------------------

plt.show()

如果是多组小提琴图的场景,遍历vg.collections的每个元素,按分组索引对应每组数据的均值计算即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:09:02