调整 seaborn.boxplot

Posted

技术标签:

【中文标题】调整 seaborn.boxplot【英文标题】:Tweaking seaborn.boxplot 【发布时间】:2016-05-09 23:29:38 【问题描述】:

我想比较一组分数分布 (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轴来显示?

编辑:

这是一个带有对数刻度 y 轴的示例 - 还不是很理想。为什么有些盒子在低端似乎被切断了?

【问题讨论】:

蓝色异常值是 matplotlib 错误,可以通过更新 seaborn 来避免。但我当然不会只删除异常值! 你试过log-scaling y 变量吗? @mwaskom 是的,但这会在图的顶部非常“压缩”较大值的条形。是否存在折衷方案,即仅对轴的一部分进行对数缩放? 有时这些组很难区分,例如如果盒子不接触。是否可以绘制分隔组的垂直线? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

异常值显示

您应该能够将任何可以传递给plt.boxplot 的参数传递给seaborn.boxplot(请参阅documentation),因此您可以通过设置flierprops 来调整异常值的显示。 Here 是您可以处理异常值的一些示例。

如果你不想显示它们,你可以这样做

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 值的最小值和最大值并相应地设置 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 范围已经包含所有值,但我将其作为如何调整这些设置的示例。正如 cmets 中提到的,对数缩放可能更有意义。

【讨论】:

flierprops 很好。我尝试将sym='+' 传递给seaborn.boxplot,但没有任何效果。 @zyxue 不写 sym = '+' ,写 marker = '+'

以上是关于调整 seaborn.boxplot的主要内容,如果未能解决你的问题,请参考以下文章

在窗口调整大小时调整图像地图大小

excel小技巧之快速调整行高列宽 如何快速调整行高列宽

调整事项与非调整事项

调整大小后调整 UIPopoverController 位置

starUML如何调整用例大小

Python调整图片大小并保存调整后的图像