箱线图中的自动(灵敏度)y轴范围
在使用pandas绘制数据框的列时,比如:
df.boxplot()
自动调整y轴
可能会导致图表中出现大量未使用的空间。我在想,这是否是因为数据框中有一些点超出了箱线图的须(但出于某种原因,这些异常值没有显示出来)。如果真是这样,有什么好的方法可以自动调整ylim
,让图表中不再有这么多空白空间呢?
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)