在Seaborn箱线图中设置异常值样式被忽略。

12
使用 Seaborn,我可以在同一张图上创建一个 pandas DataFrame 的多列箱线图。我想要对离群值(即 fliers)应用自定义样式,例如设置标记符号、颜色和标记大小。
然而,Seaborn.boxplot() 的 API 文档 只提供了一个 fliersize 参数,它允许我控制 fliers 的大小,但不能控制其颜色和符号。
由于 Seaborn 使用 matplotlib 进行绘图,因此我认为可以向 boxplot 函数提供一个 matplotlib 样式字典,如下所示:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# create a dataframe
df = pd.DataFrame({'column_a': [3, 6, 200, 100, 7], 'column_b': [1, 8, 4, 150, 290], 'column_c': [6, 7, 20, 80, 275]})

# set figure size
sns.set(rc={"figure.figsize": (14, 6)})

# define outlier properties
flierprops = dict(marker='o', markersize=5)

# create boxplot
ax = sns.boxplot(df, vert=False, showmeans=True, flierprops=flierprops)
plt.show()

结果:

箱线图 根据提供的字典,我期望看到一个代表column_c的大红色圆形标记,但实际上仍然使用了标准设置。

这个帖子描述了一个类似的问题 当直接使用matplotlib时 - 然而,从讨论中我猜测这应该在使用最新版本的matplotlib时已经修复了。

我尝试了使用iPython笔记本(iPython 3.10),matplotlib 1.4.3和seaborn 0.5.1。

2个回答

9
flierprops = dict(marker='o', markerfacecolor='None', markersize=10,  markeredgecolor='black')
sns.boxplot(y=df.Column,orient="v",flierprops=flierprops)

6
Seaborn的箱线图代码忽略了您的flierprops参数,并在将参数传递给Matplotlib之前用自己的参数覆盖它。Matplotlib的箱线图还将所有flier对象作为其返回值的一部分返回,因此您可以在运行boxplot之后修改它,但Seaborn不会返回这个值。
覆盖flierprops(和sym)似乎是一个错误,所以我会看看能否修复它:请参见this issue。与此同时,您可能需要考虑使用matplotlib的boxplot。查看seaborn的代码可能会有所帮助(boxplot在distributions.py中)。

更新:现在有一个拉取请求可以解决这个问题(flierprops和其他*props,但不包括sym


4
请注意,虽然sns.boxplot仍将忽略sym参数,但您问题中的代码现在应完全起作用,并设置正确的离群值标记。 - mwaskom
是的,在使用“pip install git+git://github.com/mwaskom/seaborn.git#egg=seaborn”升级到最新的Seaborn主分支后,它可以像我在问题中描述的那样工作。非常感谢你们! - Dirk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接