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)]
)
我知道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)]
)