【问题标题】:How to change the colour of the median line in seaborn boxplot?如何更改seaborn箱线图中中线的颜色?
【发布时间】:2020-08-28 11:24:33
【问题描述】:

更一般地说,如何更改 seaborn 箱线图中框属性子集的颜色值?是中位数,胡须,还是这样。我对如何更改中值特别感兴趣,因为我必须创建颜色较深且看不到中线的图。

下面是一些示例代码:

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax1 = plt.subplots(figsize=(15,5)

colours = ["#000184", "#834177"]
sns.set_palette(sns.color_palette(colours))
tips = sns.load_dataset("tips")
sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, ax=ax1)

创建:

可以看出,这里很难看到蓝色的中线。

注意 - 我不想改变整个箱线图的颜色,只是线的一小部分(在这种情况下是中位数)。此外 - 需要为特定组(在本例中为 Yes 吸烟者)更改它的选项,因为颜色可能不适用于两个组。

【问题讨论】:

  • 您可以在绘制箱线图后循环遍历ax.lines,并更改每隔一条中线的颜色。我不确定有更好的方法来做到这一点

标签: python matplotlib plot data-visualization seaborn


【解决方案1】:

您可以使用medianprops 更改中线的颜色。但是,所有箱线图只有一种颜色。如果您需要分配单独的颜色,您可以遍历生成的行。

ax1.get_lines() 给出由boxplot 创建的所有Line2D 对象的列表。构成一个框的每个元素都有一个 Line2D 对象:4 个用于胡须(2 条垂直线和 2 条水平线),1 个用于中值,1 个用于异常值(Line2D 表示显示没有连接线的标记)。在showmeans=True 的情况下,还会有一个Line2D 带有平均值标记。所以在这种情况下,每个盒子会有 7 个Line2Ds,在这种情况下是 6 个。

请注意,箱线图还接受参数notch=True,它显示中位数周围的置信区间。在当前图的情况下,大多数置信区间大于四分位数,这会产生一些翻转的缺口。根据您的实际应用,此类凹口有助于突出中间值。

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax1 = plt.subplots(figsize=(15,5))

colours = ["#000184", "#834177"]
sns.set_palette(sns.color_palette(colours))
tips = sns.load_dataset("tips")
sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, ax=ax1)

for line in ax1.get_lines()[4::12]:
    line.set_color('orange')
for line in ax1.get_lines()[10::12]:
    line.set_color('yellow')
plt.show()

【讨论】:

  • 谢谢 - 你怎么知道要索引哪些行?还是比你在那里使用的模式更典型?
  • 有一个典型的模式。我是通过测试不同的颜色发现的。
【解决方案2】:

可以自定义箱线图中的所有艺术家,如here 所示。由于sns.boxplot() 将所有**kwargs 转发到plt.boxplot(),因此以下工作:

tips = sns.load_dataset("tips")
colours = ["#000184", "#834177"]
sns.boxplot(x="day", y="total_bill", hue="smoker",
            data=tips, palette=colours,
            medianprops=dict(color="red", alpha=0.7),
            flierprops=dict(markerfacecolor="#707070", marker="d"))

通过这种方式,可以修改框、“飞行物”(表示异常值的点)、中线或平均线以及胡须/帽盖的美感。有关可修改属性的完整列表,请参阅 plt.boxplot() 的文档。

不幸的是,上述方法无法按照 OP 的要求调整每个类别的属性。但是使用透明颜色(例如alpha=0.4)仍然可以获得非常令人满意的结果。

注意:如果 seaborn 以结构化的方式公开有关艺术家的信息以进行此类修改,那就太好了。虽然当前版本 (seaborn v0.11) 无法做到这一点,但 seaborn 的作者正在考虑在未来添加此功能,例如参见 here

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 2020-08-07
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2023-03-29
    • 2019-12-31
    相关资源
    最近更新 更多