箱形图中的自动(晶须敏感)ylim

时间:2014-05-07 13:38:14

标签: python matplotlib pandas seaborn

使用pandas绘制数据框的列时,例如

  df.boxplot()

yaxis的自动调整可能会导致绘图中存在大量未使用的空间。我想知道这是否是因为数据框的点数超过了箱线图胡须(但由于某种原因,不显示异常值)。如果是这种情况,那么自动调整ylim以便在情节中没有那么多空白空间的好方法是什么?

enter image description here

2 个答案:

答案 0 :(得分:3)

我认为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"))

然后在数据框上使用boxplot方法,我看到类似的东西

x.boxplot()

enter image description here

但是如果你改变用于绘制异常值的符号,你就得到了

x.boxplot(sym="k.")

enter image description here

或者,您可以使用seaborn boxplot函数,它具有相同的功能,但具有一些不错的美学效果:

sns.boxplot(x)

enter image description here

答案 1 :(得分:1)

this SO帖子中的eumiro答案为基础(我只是将其扩展到pandas数据框,你可以做以下事情

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中描述了几种类型的Boxplots。 pandas框图调用matplotlib的箱形图。如果您查看documentation for this参数whis“将胡须的长度定义为内四分位数范围的函数。因此,它不会覆盖整个范围。