- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Matplotlib 或 Seaborn 箱线图给出了第 25 个百分位数和第 75 个百分位数之间的四分位数范围。有没有办法为 Boxplot 提供自定义四分位数范围?我需要获得箱线图,使四分位数范围位于第 10 个百分位数和第 90 个百分位数之间。在谷歌和其他来源上查找,开始了解如何在箱形图上获取自定义晶须,而不是自定义四分位数范围。希望能在这里得到一些有用的解决方案。
最佳答案
是的,可以在您想要的任何百分位处绘制箱线边缘的箱线图。
对于箱线图和须线图,通常绘制数据的第 25 个和第 75 个百分位数。因此,您应该意识到,背离此约定会使您面临误导读者的风险。您还应该仔细考虑更改箱形百分位数对异常值分类和箱线图的须线意味着什么。
一个快速解决方案(忽略对晶须位置的任何影响)是计算我们想要的箱线图统计数据,改变 q1
和 q3
的位置,然后用 ax.bxp
:
import matplotlib.cbook as cbook
import matplotlib.pyplot as plt
import numpy as np
# Generate some random data to visualise
np.random.seed(2019)
data = np.random.normal(size=100)
stats = {}
# Compute the boxplot stats (as in the default matplotlib implementation)
stats['A'] = cbook.boxplot_stats(data, labels='A')[0]
stats['B'] = cbook.boxplot_stats(data, labels='B')[0]
stats['C'] = cbook.boxplot_stats(data, labels='C')[0]
# For box A compute the 1st and 99th percentiles
stats['A']['q1'], stats['A']['q3'] = np.percentile(data, [1, 99])
# For box B compute the 10th and 90th percentiles
stats['B']['q1'], stats['B']['q3'] = np.percentile(data, [10, 90])
# For box C compute the 25th and 75th percentiles (matplotlib default)
stats['C']['q1'], stats['C']['q3'] = np.percentile(data, [25, 75])
fig, ax = plt.subplots(1, 1)
# Plot boxplots from our computed statistics
ax.bxp([stats['A'], stats['B'], stats['C']], positions=range(3))
但是,查看生成的图,我们发现改变 q1
和 q3
同时保持 mustache 不变可能不是一个明智的想法。您可以通过重新计算来解决这个问题,例如。 stats['A']['iqr']
和须线位置 stats['A']['whishi']
和 stats['A'] ['whislo']
.
查看matplotlib的源代码,我们发现matplotlib使用matplotlib.cbook.boxplot_stats
来计算箱线图中使用的统计数据。
在 boxplot_stats
中,我们找到代码 q1, med, q3 = np.percentile(x, [25, 50, 75])
。我们可以改变这条线来改变绘制的百分位数。
因此,一个潜在的解决方案是制作 matplotlib.cbook.boxplot_stats
的副本并根据我们的需要进行更改。在这里,我调用函数 my_boxplot_stats
并添加参数 percents
以便轻松更改 q1
和 q3
的位置>.
import itertools
from matplotlib.cbook import _reshape_2D
import matplotlib.pyplot as plt
import numpy as np
# Function adapted from matplotlib.cbook
def my_boxplot_stats(X, whis=1.5, bootstrap=None, labels=None,
autorange=False, percents=[25, 75]):
def _bootstrap_median(data, N=5000):
# determine 95% confidence intervals of the median
M = len(data)
percentiles = [2.5, 97.5]
bs_index = np.random.randint(M, size=(N, M))
bsData = data[bs_index]
estimate = np.median(bsData, axis=1, overwrite_input=True)
CI = np.percentile(estimate, percentiles)
return CI
def _compute_conf_interval(data, med, iqr, bootstrap):
if bootstrap is not None:
# Do a bootstrap estimate of notch locations.
# get conf. intervals around median
CI = _bootstrap_median(data, N=bootstrap)
notch_min = CI[0]
notch_max = CI[1]
else:
N = len(data)
notch_min = med - 1.57 * iqr / np.sqrt(N)
notch_max = med + 1.57 * iqr / np.sqrt(N)
return notch_min, notch_max
# output is a list of dicts
bxpstats = []
# convert X to a list of lists
X = _reshape_2D(X, "X")
ncols = len(X)
if labels is None:
labels = itertools.repeat(None)
elif len(labels) != ncols:
raise ValueError("Dimensions of labels and X must be compatible")
input_whis = whis
for ii, (x, label) in enumerate(zip(X, labels)):
# empty dict
stats = {}
if label is not None:
stats['label'] = label
# restore whis to the input values in case it got changed in the loop
whis = input_whis
# note tricksyness, append up here and then mutate below
bxpstats.append(stats)
# if empty, bail
if len(x) == 0:
stats['fliers'] = np.array([])
stats['mean'] = np.nan
stats['med'] = np.nan
stats['q1'] = np.nan
stats['q3'] = np.nan
stats['cilo'] = np.nan
stats['cihi'] = np.nan
stats['whislo'] = np.nan
stats['whishi'] = np.nan
stats['med'] = np.nan
continue
# up-convert to an array, just to be safe
x = np.asarray(x)
# arithmetic mean
stats['mean'] = np.mean(x)
# median
med = np.percentile(x, 50)
## Altered line
q1, q3 = np.percentile(x, (percents[0], percents[1]))
# interquartile range
stats['iqr'] = q3 - q1
if stats['iqr'] == 0 and autorange:
whis = 'range'
# conf. interval around median
stats['cilo'], stats['cihi'] = _compute_conf_interval(
x, med, stats['iqr'], bootstrap
)
# lowest/highest non-outliers
if np.isscalar(whis):
if np.isreal(whis):
loval = q1 - whis * stats['iqr']
hival = q3 + whis * stats['iqr']
elif whis in ['range', 'limit', 'limits', 'min/max']:
loval = np.min(x)
hival = np.max(x)
else:
raise ValueError('whis must be a float, valid string, or list '
'of percentiles')
else:
loval = np.percentile(x, whis[0])
hival = np.percentile(x, whis[1])
# get high extreme
wiskhi = np.compress(x <= hival, x)
if len(wiskhi) == 0 or np.max(wiskhi) < q3:
stats['whishi'] = q3
else:
stats['whishi'] = np.max(wiskhi)
# get low extreme
wisklo = np.compress(x >= loval, x)
if len(wisklo) == 0 or np.min(wisklo) > q1:
stats['whislo'] = q1
else:
stats['whislo'] = np.min(wisklo)
# compute a single array of outliers
stats['fliers'] = np.hstack([
np.compress(x < stats['whislo'], x),
np.compress(x > stats['whishi'], x)
])
# add in the remaining stats
stats['q1'], stats['med'], stats['q3'] = q1, med, q3
return bxpstats
有了这个,我们就可以计算统计数据,然后使用 plt.bxp
进行绘图。
# Generate some random data to visualise
np.random.seed(2019)
data = np.random.normal(size=100)
stats = {}
# Compute the boxplot stats with our desired percentiles
stats['A'] = my_boxplot_stats(data, labels='A', percents=[1, 99])[0]
stats['B'] = my_boxplot_stats(data, labels='B', percents=[10, 90])[0]
stats['C'] = my_boxplot_stats(data, labels='C', percents=[25, 75])[0]
fig, ax = plt.subplots(1, 1)
# Plot boxplots from our computed statistics
ax.bxp([stats['A'], stats['B'], stats['C']], positions=range(3))
看到,通过此解决方案,我们的函数中的须线根据我们选择的百分位数进行了调整。:
关于python - 在 Matplotlib 中为 Boxplot 提供自定义四分位数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54911424/
假设我得到了两个整数 a, b 其中 a 是一个正整数并且小于 b 。我必须找到一种有效的算法,它会在 [a, b] 区间内给出 base2 位数(位数)的总和。例如,在区间 [0, 4] 中,数字之
到目前为止我已经尝试过不同的 autofilter但非选项似乎对我有用,我有许可证号列,其中应该只有 10 位数字,并且 autofilter我正在尝试查找少于或多于 10 位数字的条目, 我将该列转
谁能告诉我检查输入的数字是否为 3 位数字的正则表达式...它也不应该允许字母.... 最佳答案 3 个数字的正则表达式为 ^[0-9]{3}$ 或 ^\d{3}$ 关于javascript - 是否
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
我正在运行一个我创建的java程序,它存储用户输入的数据。具体来说,有 4 个数组列表,分别是songName、songArtist、songYear 和songAlbum。我有一个“songYear
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
给定一个 float ,我想使用半偶数舍入将结果四舍五入到小数点后四位,即四舍五入到下一个偶数的方法。例如,当我有以下代码片段时: #include #include int main(){
有没有一种方法可以在不使用小程序的情况下确定客户端计算机上的 jvm 位数?我确实看到了这个link但这决定了 jvm 版本而不是位数。提前致谢 最佳答案 您可以尝试确定浏览器位数 - 32 位 ja
我正在编写一个程序来计算给定数字的两个二进制表示之间的共同位数。我写的代码是: int common_bits(int a, int b) { static long binaryNo1,binary
如何使表格中的每个单元格的最小宽度为 3 位数字并且不会更大?现在我正在对 min-width 进行硬编码,但我不喜欢对值进行硬编码,因为将来我可能想更改字体。如果需要 Javascript 也没关系
我正在尝试匹配后跟一个空格或制表符和 5 个数字的单词。例如 some noise text off 12345 some noise text again. 另一个例子是: Some noise t
我在从 double 到 string 的转换时遇到问题。 我要转换: double value: 0.0772486324655191 string value: 0.077248632465519
我正在尝试实现一个使用 128 位 key 的密码。 key 计划的一部分是将 key 向右旋转 29 位,但我不确定该怎么做,因为 Java 中没有单一数据类型可以保存整个 key 。我将它存储在两
我正在尝试在 AVX2 中对 128 位数进行左旋转。由于没有直接的方法,我尝试使用左移和右移来完成我的任务。 这是我执行相同操作的代码片段。 l = 4; r = 4
我有一个 int,它的值类似于 1235 和 12890。我只想要这个 int 的前 2 位数字。我怎样才能提取它? 想了半天,想不出什么办法。 最佳答案 减少数字,直到只剩下两位数: while (
TL:DR 我想要紧跟“+”符号的任何行上的前两个数字的语法。 给定以下文本(来自熟悉的实用程序): power_meter-acpi-0 Adapter: ACPI interface power1
因此根据 cplusplus.com,当您通过以下方式将输出流的格式标志设置为科学记数法时 of.setf(ios::scientific) 您应该在指数中看到 3 位加号和一个符号。但是,我的输出似
这个问题在这里已经有了答案: How can I pad a value with leading zeros? (77 个答案) 关闭 9 年前。 如果小时数小于 10 小时,则小时数通常以个位数
我正在使用 moment.js使用根据距离/速度计算的日期时间。我也在使用 moment duration format plugin .当我将值传递给 moment.duration 然后对其进行格
我正在将一个应用程序从 .NET 移植到 Mono 运行时,并且在代码中的某个位置我可以看到一个 float 具有值 158136.422。我对 float 的理解是它是 7 位精度,那么这个数字如何
我是一名优秀的程序员,十分优秀!