调整seaborn.boxplot

时间:2016-02-01 13:30:30

标签: python matplotlib plot boxplot seaborn

我想比较一组分数(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")

我对这个情节有一些问题:

  • 有很多异常值,我不喜欢它们是如何被吸引到这里的。我可以删除它们吗?我可以改变外观以减少混乱吗?我可以给它们着色至少使它们的颜色与盒子颜色相匹配吗?
  • modeloriginal是特殊的,因为所有其他分布都应与original的分布进行比较。这应该在视图中直观地反映出来。我可以将original作为每个组的第一个框吗?我可以以某种方式偏移或标记它吗?是否可以在每个original分布的中间位置和通过一组方框画一条水平线?
  • score的某些值非常小,如何正确缩放y轴以显示它们?

enter image description here

编辑:

以下是使用对数缩放的y轴的示例 - 也不理想。为什么有些盒子似乎在低端切断?

enter image description here

2 个答案:

答案 0 :(得分:35)

异常值显示

您应该能够将seaborn.boxplot的任何参数传递给plt.boxplot(参见documentation),这样您就可以通过设置{{1}来调整异常值的显示}}。 Here是您可以使用异常值进行操作的一些示例。

如果您不想显示它们,可以

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

缩放y轴

您可以获取所有y值的最小值和最大值,并相应地设置seaborn.boxplot(x="centrality", y="score", hue="model", data=data, hue_order=["original", "Havel..","etc"]) ?像这样:

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))) 范围已包含所有值,但我只是将其作为如何调整这些设置的示例。正如评论中所提到的,日志缩放可能更有意义。

答案 1 :(得分:1)

这个答案已经有一段时间没有活动了,但我会回答 OP 关于未来需要帮助的任何人的奇怪下界的问题。

一旦将 y 轴设置为对数刻度,就不可能表示 y=0,因为 log(0) 趋向于 -inf。

因此,当箱线图下部的值为零或非常接近于零时,箱体看起来像是被“切成两半”。

不用说,用对数刻度表示负 y 值也是不可能的。