Plotly:如何在箱线图中更改胡须的长度 (min/max)?

Plotly: How to change length of whiskers (min/max) in a boxplot?

我知道1.5 * IQR是一个通用规则,但如果可能的话我想绘制其他min/max。我正在使用 plotly (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 或任何其他数字。

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

谢谢!

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

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

By default, the whiskers correspond to the box' edges +/- 1.5 times the interquartile range (IQR: Q3-Q1), see "boxpoints" for other options.

boxpoints 下您会发现:

If "outliers", only the sample points lying outside the whiskers are shown If "suspectedoutliers", the outlier points are shown and points either less than 4*Q1-3*Q3 or greater than 4*Q3-3*Q1 are highlighted (see outliercolor) If "all", all sample points are shown If False, only the box(es) are shown with no sample points

所以对于

的不同值

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

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

这是一种方法:

框点设置为 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 - 方框点 = 假:

地块 1 - 方框点 = 'outliers':

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

完整剧情:

完整代码:

# 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)

当前的 plotly 允许设置上下围栏,如原始问题的评论中所述。我花了很长时间才弄明白我怎么会这样认为我可以免除别人的痛苦。

您需要指定q1、med、q2以及上下围栏。我在下面给出了一个例子,其中 a 是一个数组。

fig.add_trace(go.Box(y=[a]))
    
fig.update_traces(q1=[np.percentile(a,25)], 
                  median=[np.percentile(a,50)],
                  q3=[np.percentile(a,75)],
                  lowerfence=[np.min(a)],
                  upperfence=[np.max(a)] 
                  )