微调seaborn.boxplot

45

我想比较一组得分(score)的分布,这些得分按某些类别(centrality)分组并按其他类别(model)着色。我已经尝试使用seaborn实现:

plt.figure(figsize=(14,6))
seaborn.boxplot(x="centrality", y="score", hue="model", data=data, palette=seaborn.color_palette("husl", len(models) +1))
seaborn.despine(offset=10, trim=True)
plt.savefig("/home/i11/staudt/Eval/properties-replication-test.pdf", bbox_inches="tight")

这个图有一些问题:

  • 存在大量离群点,我不喜欢它们在这里如何绘制。我能否删除它们?我能否改变外观以显示更少的混乱?至少可以将它们的颜色设置为匹配框的颜色吗?
  • model original 很特殊,因为所有其他分布都应与 original 的分布进行比较。这应该在可视化中反映出来。我能否使每个组的第一个框为 original ?我能否以某种方式偏移或标记它?是否可能通过每个 original 分布和箱子组之间穿过中位数的水平线来绘制?
  • 一些 score 的值非常小,如何正确缩放y轴以显示它们?

enter image description here

编辑:

这里是一个使用对数刻度的y轴的示例-但还不是理想的。为什么一些框似乎在低端被截断了?

enter image description here


1
蓝色的异常值是matplotlib的一个bug,可以通过更新seaborn来避免。但我肯定不会只是删除这些异常值! - mwaskom
2
你尝试过对y变量进行对数缩放吗? - mwaskom
@mwaskom 是的,但是这会在图的顶部非常压缩较大值的条形。有没有折中的办法,即仅对轴的一部分进行对数缩放? - clstaudt
有时候很难区分这些组,例如如果方框没有接触。是否可以画垂直线来分隔这些组? - clstaudt
2个回答

83

异常值显示

您可以将任何参数传递给seaborn.boxplot,就像您可以传递给plt.boxplot一样(请参阅文档),因此您可以通过设置flierprops来调整异常值的显示方式。 这里是一些关于如何处理异常值的示例。

如果您不想显示它们,可以执行以下操作:

seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                showfliers=False)

或者您可以将它们变成浅灰色,像这样:

flierprops = dict(markerfacecolor='0.75', markersize=5,
              linestyle='none')
seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                flierprops=flierprops)

分组顺序

您可以使用hue_order手动设置组的顺序,例如:

seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                hue_order=["original", "Havel..","etc"])

纵轴的缩放

你可以获取所有y值的最小值和最大值,并相应地设置y_lim。类似这样:

y_values = data["scores"].values
seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                y_lim=(np.min(y_values),np.max(y_values)))

编辑:这最后一点并不是很有意义,因为自动的y_lim范围已经包括了所有值,但我还是留着它作为如何调整这些设置的示例。正如评论中提到的那样,对数缩放可能更有意义。


flierprops 很好用。我尝试将 sym='+' 传递给 seaborn.boxplot,但它没有任何效果。 - zyxue
@ zyxue 在编写代码时,不要写 sym = '+',而应该写 marker = '+'。 - imran khan
在seaborn.boxplot中没有“y_lim”参数。https://dev59.com/fVcP5IYBdhLWcg3wAmEE - Luxspes

2
自从这个答案活跃以来已经有一段时间了,但对于未来需要帮助的任何人,我将回答关于奇怪的下限的问题。
一旦您将y轴设置为对数比例尺,就无法表示y=0,因为log(0)趋近于-inf。
因此,当与箱形图底部相关的值为零或非常接近零时,该框看起来似乎被“切成两半”。
不用说,在对数比例尺中也无法表示负y值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接