如何确定seaborn violinplot特定y值对应边缘的x坐标以绘制均值线
实现方法
Seaborn绘制的小提琴图本质是Matplotlib的PathPatch对象,存储在sns.violinplot返回对象的collections属性中,我们可以直接提取小提琴轮廓的所有坐标点,计算对应y值(均值)下的x边界:
- 提取小提琴轮廓的所有坐标点
- 匹配和目标y值(均值)最接近的轮廓点,取对应的x坐标最大值即为边界值
- 用得到的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
相关产品推荐
相关产品推荐

