matplotlib 最小值、最大值、平均值和标准差箱形图

guz6ccqo  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(182)

我想使用数据集的最小值、最大值和平均值输出以及标准差创建一个箱线图。我发现的examples绘制了一个数字分布,但在我的情况下,这是不可行的。
有没有办法在Python(Matplotlib)中做到这一点?

dfddblmv

dfddblmv1#

上面@罗兰给出的答案很重要:箱形图显示的是完全不同的数量,如果使用现有数量绘制类似的图,可能会使用户感到困惑。我可能会使用堆叠误差条图来表示此信息。举例来说:

import matplotlib.pyplot as plt
import numpy as np

# construct some data like what you have:
x = np.random.randn(100, 8)
mins = x.min(0)
maxes = x.max(0)
means = x.mean(0)
std = x.std(0)

# create stacked errorbars:
plt.errorbar(np.arange(8), means, std, fmt='ok', lw=3)
plt.errorbar(np.arange(8), means, [means - mins, maxes - means],
             fmt='.k', ecolor='gray', lw=1)
plt.xlim(-1, 8)

字符串
x1c 0d1x的数据

vmpqdwk3

vmpqdwk32#

给定可用的信息(平均值,标准差,最小值,最大值),errorbar可能是唯一可以绘制的图,但是如果你想从聚合数据中绘制一个箱形图,matplotlib有bxp()方法可以使用。请注意,它是一个Axes级别的函数(不能被称为plt.bxp)。它使用字典列表,其中每个字典包含有关特定箱线图的数据。
然而,箱形图至少需要中位数、第一和第三四分位数,这不能从平均值、标准差等推断出来。而不需要进一步假设数据集的分布。
假设数据集是正态分布的。然后,我们可以估计中位数,第一和第三四分位数使用平均值和标准差。使用这些值,我们还可以近似胡须。假设异常值不可用,我们可以绘制一个基本的箱形图,如下所示。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# construct some data
x = np.random.default_rng(0).normal(size=(1000, 8))

means = x.mean(axis=0)
q1 = means + std * stats.norm.ppf(0.25)
q3 = means + std * stats.norm.ppf(0.75)
whislo = q1 - (q3 - q1)*1.5
whishi = q3 + (q3 - q1)*1.5

keys = ['med', 'q1', 'q3', 'whislo', 'whishi']
stats = [dict(zip(keys, vals)) for vals in zip(means, q1, q3, whislo, whishi)]
plt.subplot().bxp(stats, showfliers=False);

字符串


的数据
现在假设我们可以访问中位数,第一和第三四分位数(下面的medianq1q3)。此外,假设我们可以访问刚好低于q1-(q3-q1)*1.5和刚好高于q3+(q3-q1)*1.5的值,这些值可用于定位晶须。此外,假设我们可以访问晶须(fliers)之外的值。然后将所有这些信息传递给bxp(),绘制一个与plt.boxplot绘制的图形完全相同的图形。

# construct some data
x = np.random.default_rng(0).normal(size=(1000, 8))
median = np.median(x, axis=0)
q1 = np.quantile(x, 0.25, axis=0)
q3 = np.quantile(x, 0.75, axis=0)

# compute whiskers' locations
whislo = [np.min(x[x[:, i] > v, i]) for i, v in enumerate(q1 - (q3 - q1)*1.5)]
whishi = [np.max(x[x[:, i] < v, i]) for i, v in enumerate(q3 + (q3 - q1)*1.5)]
# identify fliers
fliers = [x[(x[:, i] < lo) | (x[:, i] > hi), i] for i, (lo, hi) in enumerate(zip(whislo, whishi))]

keys = ['med', 'q1', 'q3', 'whislo', 'whishi', 'fliers']
stats = [dict(zip(keys, vals)) for vals in zip(median, q1, q3, whislo, whishi, fliers)]

plt.subplot().bxp(stats);



您可以验证上面的图是否与由绘制的图完全相同

plt.boxplot(x);

相关问题