2

我知道这1.5 * IQR是一个常见的规则,但如果可能的话,我想绘制其他最小值/最大值。我正在使用情节(python)。基本上,我想定义一个函数来通过参数数据框、列和自定义乘数显示箱线图。

df_test = pd.Series(np.array([26124.0, 8124.0, 27324.0, 13188.0, 21156.0]))

def get_boxplot(df,column, multiplier):
    data = [go.Box(y=df[column],boxpoints="outliers")]
    return pyo.plot(data)

get_boxplot(df_test,0,3)

我的目标是用1.5 * IQR乘数参数替换。在本例中为 3 或任何其他数字。

你知道如何改变我的功能吗?

谢谢!

4

1 回答 1

3

在 python 的范围内似乎不可能获得您正在寻找的确切结果,这意味着这些属性充其量只能在 javascript 上下文中使用。

不过,关于胡须的放置,您仍然有一些选择。顺便说一句,你是对的1.5 * IQR。从help(fig)你可以找到:

默认情况下,胡须对应于盒子的边缘 +/- 1.5 倍的四分位间距(IQR:Q3-Q1),其他选项请参见“boxpoints”。

在下面boxpoints你会发现:

如果为“异常值”,则仅显示位于晶须外的样本点 如果为“怀疑异常值”,则显示异常值并突出显示小于 4*Q1-3*Q3 或大于 4*Q3-3*Q1 的点 (请参阅outliercolor)如果“全部”,则显示所有样本点如果为假,则仅显示没有样本点的框

所以对于不同的值

'boxpoints':False, 'all', outliers你会得到:

在此处输入图像描述

正如您将在下面看到的,是否boxpoints显示也将决定胡须的位置。因此,您可以在自定义函数中用作False, 'all', outliers参数,至少能够在这些选项之间进行更改。从你的问题来看,boxpoints=False应该不会离目标太远。

这是一种方法:

boxpoints 设置为 False 的代码:

# imports
from plotly.subplots import make_subplots
import plotly.graph_objs as go
import pandas as pd
import numpy as np

# data
np.random.seed(123)
y0 = np.random.randn(50)-1
x0 = y0
x0 = [0 for y in y0]
y0[-1] = 4 # include an outlier

# custom plotly function
def get_boxplot(boxpoints):
    fig = go.Figure(go.Box(y=y0, boxpoints = boxpoints, pointpos = 0,
                           )
                   )

    fig.show()

get_boxplot(boxpoints='outliers')

情节 1 - Boxpoints = False:

在此处输入图像描述

情节 1 - Boxpoints = '异常值': 在此处输入图像描述

不过,这将引发另一个问题,因为默认情况下,第一种情况下不显示标记。但是您可以通过包含另一个这样的跟踪来处理它:

完整的情节:

在此处输入图像描述

完整代码:

# imports
from plotly.subplots import make_subplots
import plotly.graph_objs as go
import pandas as pd
import numpy as np

# data
np.random.seed(123)
y0 = np.random.randn(50)-1
x0 = y0
x0 = [0 for y in y0]
y0[-1] = 4 # include an outlier

# custom plotly function
def get_boxplot(boxpoints):
    fig = go.Figure(go.Box(y=y0, boxpoints = boxpoints, pointpos = 0,
                           )
                   )

    if boxpoints==False:
        fig.add_trace(go.Box(x=x0,
                        y=y0, boxpoints = 'all', pointpos = 0,
                        marker = dict(color = 'rgb(66, 66, 244)'),
                        line = dict(color = 'rgba(0,0,0,0)'),
                        fillcolor = 'rgba(0,0,0,0)'
                    ))

    get_boxplot.show()

foo(boxpoints=False)
于 2019-12-02T13:43:55.130 回答