【发布时间】:2014-06-24 12:38:31
【问题描述】:
当使用 pandas 绘制数据框的列时,例如
df.boxplot()
yaxis 的自动调整会导致剧情中有大量未使用的空间。我想知道这是否是因为数据框的点超过了箱线图须线(但由于某种原因,未显示异常值)。如果是这种情况,那么自动调整ylim 以使情节中没有太多空白空间的好方法是什么?
【问题讨论】:
标签: python matplotlib pandas seaborn
当使用 pandas 绘制数据框的列时,例如
df.boxplot()
yaxis 的自动调整会导致剧情中有大量未使用的空间。我想知道这是否是因为数据框的点超过了箱线图须线(但由于某种原因,未显示异常值)。如果是这种情况,那么自动调整ylim 以使情节中没有太多空白空间的好方法是什么?
【问题讨论】:
标签: python matplotlib pandas seaborn
我认为 seaborn 风格和 matplotlib 绘制箱线图方式的结合在这里隐藏了你的异常值。
如果我生成一些倾斜的数据
import seaborn as sns
import pandas as pd
import numpy as np
x = pd.DataFrame(np.random.lognormal(size=(100, 6)),
columns=list("abcdef"))
然后在dataframe上使用boxplot方法,我看到类似的东西
x.boxplot()
但是如果你改变用于绘制异常值的符号,你会得到
x.boxplot(sym="k.")
或者,您可以使用 seaborn boxplot 函数,它做同样的事情,但有一些漂亮的美学:
sns.boxplot(x)
【讨论】:
基于 eumiro 在this SO 帖子中的回答(我只是将它扩展到熊猫数据框,您可以执行以下操作
import numpy as np
import pandas as pd
def reject_outliers(df, col_name, m=2):
""" Returns data frame without outliers in the col_name column """
return df[np.abs(df[col_name] - df[col_name].mean()) < m * df[col_name].std()]
# Create fake data
N = 10
df = pd.DataFrame(dict(a=np.random.rand(N), b=np.random.rand(N)))
df = df.append(dict(a=0.1, b=10), ignore_index=True)
# Strip outliers from the "b" column
df = reject_outliers(df, "b")
bp = df.boxplot()
参数m 是要忽略的标准差数。
编辑:
为什么胡须首先不包括最大异常值?
Wikipedia 中描述了几种类型的箱线图。 pandas 箱线图调用matplotlib 的箱线图。如果您查看documentation for this 参数whis“将晶须的长度定义为内部四分位数范围的函数。因此它不会通过设计覆盖整个范围。
【讨论】: