如何更改箱线图中中线的颜色

bax*_*axx 7 python plot matplotlib boxplot seaborn

更一般地说,如何更改 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)
Run Code Online (Sandbox Code Playgroud)

这会创建:

在此输入图像描述

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

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

nor*_*ius 11

可以自定义箱线图中的所有艺术家,如此处所示。由于sns.boxplot()将所有内容转发**kwargsplt.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"))
Run Code Online (Sandbox Code Playgroud)

结果图

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

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

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


Joh*_*anC 4

更新:这个答案的旧版本使用生成的线中的索引来猜测绘图的哪条线对应于中线。新版本为每个方法附加了一个特殊的标签,稍后可以检索该标签以仅过滤掉这些行。

您可以用来medianprops更改中线的颜色。但是,所有箱线图只有一种颜色。如果需要分配单独的颜色,可以循环生成的线条。这使得代码对于不同的选项和未来可能的更改更加稳健。

ax1.get_lines()Line2D给出所创建的所有对象的列表boxplotLine2D构成盒子的每个元素都会有一个对象:4 个用于胡须(2 条垂直线和 2 条水平线),1 个用于中值,1 个用于异常值(Line2D它显示没有连接线的标记) 。如果showmeans=True还有一个带有Line2D平均值标记的。因此,在这种情况下,每个盒子有 7Line2D秒,在本例中为 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,
            medianprops={'color': 'red', 'label': '_median_'})

median_colors = ['orange', 'yellow']
median_lines = [line for line in ax1.get_lines() if line.get_label() == '_median_']
for i, line in enumerate(median_lines):
    line.set_color(median_colors[i % len(median_colors)])
plt.show()
Run Code Online (Sandbox Code Playgroud)

中值颜色发生变化的箱线图