【问题标题】:Automatic (whisker-sensitive) ylim in boxplots箱线图中的自动(晶须敏感)ylim
【发布时间】:2014-06-24 12:38:31
【问题描述】:

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

  df.boxplot()

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

【问题讨论】:

标签: python matplotlib pandas seaborn


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    基于 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“将晶须的长度定义为内部四分位数范围的函数。因此它不会通过设计覆盖整个范围。

    【讨论】:

    • 谢谢!你知道为什么原始图中没有显示异常值吗?我知道如果没有看到数据就很难做到这一点,但是考虑到图的大小,它们没有资格成为异常值是否有意义?
    • 如果要查看原始数据have a look at this post。抱歉,我在发帖时并没有真正考虑到这一点,我会在原帖中进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多