在Seaborn boxplot中设置flier(离群值)样式将被忽略

Dir*_*irk 9 python matplotlib seaborn

使用Seaborn,我可以pandas DataFrame在同一个图上创建多个一列的箱形图.我想将自定义样式应用于传单(异常值),例如设置标记符号,颜色和标记大小.

但是,seaborn.boxplot上的API文档仅提供了一个参数fliersize,可以让我控制传单的大小,但不能控制颜色和符号.

由于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()
Run Code Online (Sandbox Code Playgroud)

结果:

箱形图 根据提供的字典,我希望有一个代表传单的大红色圆圈,column_c但是仍然使用标准设置.

当直接使用matplotlib时,这个线程描述了一个类似的问题 - 但是,从讨论中我猜想在使用matplotlib的最新版本时应该同时修复它.

我用iPython笔记本(iPython 3.10),matplotlib 1.4.3和seaborn 0.5.1尝试了这个.

小智 9

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


cge*_*cge 6

Seaborn的boxplot代码忽略了你的flierprops参数,并在将参数传递给Matplotlib之前用自己的参数覆盖它.Matplotlib的boxplot还返回所有flier对象作为其返回值的一部分,因此您可以在运行boxplot后修改它,但Seaborn不会返回此值.

覆盖flierprops(和sym)似乎是一个bug,所以我会看看我是否可以修复它:看到这个问题.同时,您可能需要考虑使用matplotlib的boxplot.查看seaborn的代码可能很有用(boxplot在distributions.py中).


更新:现在有一个拉取请求修复了这个(flierprops和其他*props,但没有sym)

  • 只是想注意,虽然`sns.boxplot`仍会忽略`sym`参数,但问题中的代码现在应该完全有效,包括为传单设置正确的标记. (3认同)