调整 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")
这个情节我有一些问题:
存在大量异常值,我不喜欢这里的绘制方式。我可以删除它们吗?我可以更改外观以减少混乱吗?我可以至少给它们上色,使它们的颜色与盒子颜色相匹配吗?model
值 original
是特殊的,因为所有其他分布都应与 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的主要内容,如果未能解决你的问题,请参考以下文章