Seaborn 箱线图水平线标注

Posted

技术标签:

【中文标题】Seaborn 箱线图水平线标注【英文标题】:Seaborn boxplot horizontal line annotation 【发布时间】:2019-01-31 00:00:45 【问题描述】:

我想在一些图中添加水平线,即“目标”线:带状图、箱线图和小提琴图,以显示理想值数据(或理想的范围)。

这个 R 示例 (Add multiple horizontal lines in a boxplot) - 第一个图像 - 基本上就是它(尽管我会做一些格式化以使其看起来像样)。

R abline() equivalent in Python 对我没有帮助(或者我还没有弄清楚如何),因为我正在使用分类数据,所以我只想定义(例如)y=3 并绘制它。 我的代码(如下)运行良好,只是不知道如何添加一行。

fig, ax = plt.subplots(nrows=4,figsize=(20,20))

sns.violinplot(x="Wafer", y="Means", hue='Feature', 
           data=Means[Means.Target == 1], ax=ax[0])
sns.violinplot(x="Wafer", y="Means", hue='Feature', 
           data=Means[Means.Target == 3], ax=ax[1])
sns.boxplot(x="Feature", y="Means", 
        data=Means, linewidth=0.8, ax=ax[2])
sns.stripplot(x="Feature", y="Means", hue='Wafer',
          data=Means, palette="plasma", jitter=0.1, size=5.5, ax=ax[3])

非常感谢任何帮助。

【问题讨论】:

应该是plt.hlines(y, xmin, xmax) 【参考方案1】:

假设您不想在高度y 和从x1x2 绘制一条水平线,其中x1x2 是您的实际x 数据值。以下只是您可以做到的几种方法中的三种:

第一:

ax.hlines(y, x1, x2)

第二:

plt.plot([x1, x2], [y, y])

第三个(x1x2 现在在 0 表示最左边和 1 表示最右边之间的相对/分数坐标中):

ax.axhline(y, x1, x2)

【讨论】:

谢谢 - 你的第三个版本正是我想要的。如何为多行做到这一点:例如ax.axhline[(3, 0, 1),(1,0,1)](这不起作用)如果我想在y=3y=1 处留言 好的,那么你只需要写两行:ax.axhline(1, 0, 1)ax.axhline(3, 0, 1)。你也可以把它放在for 循环中,但只有两行,我认为没有必要 我实际上是在 for 循环中执行此操作的,因为我无法让它工作(在我上面的代码的上下文中),两次调用该函数。 for 循环运行良好,谢谢。【参考方案2】:

如果您想定义一个好的或坏的区域,我通常会发现在数据后面放置一个补丁更容易让用户解释。

fig, ax = plt.subplots(figsize=(4, 4))
ax.plot([1,2,3,4], [1,2,3,4], color='blue')  # simple example line

# define patch area
rect = patches.Rectangle(
    xy=(ax.get_xlim()[0], 2),  # lower left corner of box: beginning of x-axis range & y coord)
    width=ax.get_xlim()[1]-ax.get_xlim()[0],  # width from x-axis range
    height=1,
    color='green', alpha=0.1, ec='red'
)
ax.add_patch(rect)
plt.show()

【讨论】:

感谢 ak_slick,这是一个很好的观点;我会尝试实施和反馈。

以上是关于Seaborn 箱线图水平线标注的主要内容,如果未能解决你的问题,请参考以下文章

使用 seaborn 或 matplotlib 分组箱线图的数据格式

在seaborn中绘制多个箱线图?

seaborn箱线图的子图

Seaborn 和 Pandas,分组箱线图

沿 x 轴所需距离处的 seaborn 箱线图

使用 seaborn 的单个箱线图中的多列