箱线图中的自动(灵敏度)y轴范围

1 投票
2 回答
2004 浏览
提问于 2025-04-18 05:40

在使用pandas绘制数据框的列时,比如:

  df.boxplot()

自动调整y轴可能会导致图表中出现大量未使用的空间。我在想,这是否是因为数据框中有一些点超出了箱线图的须(但出于某种原因,这些异常值没有显示出来)。如果真是这样,有什么好的方法可以自动调整ylim,让图表中不再有这么多空白空间呢?

enter image description here

2 个回答

1

在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 是指要忽略的标准差数量。

编辑:

为什么箱线图的“胡须”一开始就不包括最大异常值呢?

箱线图有几种类型,详细信息可以在维基百科上找到。pandas的箱线图实际上是调用了matplotlib的箱线图功能。如果你查看这个文档,你会发现参数 whis“定义了胡须的长度,作为内四分位范围的一个函数。因此,它的设计并不会覆盖整个范围。

4

我觉得,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()

在这里输入图片描述

但是如果你改变绘制异常值时使用的符号,你会得到

x.boxplot(sym="k.")

在这里输入图片描述

另外,你可以使用seaborn的boxplot函数,它做的事情相同,但看起来更好看:

sns.boxplot(x)

在这里输入图片描述

撰写回答