【问题标题】:Tweaking seaborn.boxplot调整 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 是的,但这会在图的顶部非常“压缩”较大值的条形。是否存在折衷方案,即仅对轴的一部分进行对数缩放?
  • 有时这些组很难区分,例如如果盒子不接触。是否可以绘制分隔组的垂直线?

标签: python matplotlib plot boxplot seaborn


【解决方案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 = '+'
    猜你喜欢
    • 2017-08-24
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多