我想使用数据集的最小值、最大值和平均值输出以及标准差创建一个箱线图。我发现的examples绘制了一个数字分布,但在我的情况下,这是不可行的。有没有办法在Python(Matplotlib)中做到这一点?
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的数据
vmpqdwk32#
给定可用的信息(平均值,标准差,最小值,最大值),errorbar可能是唯一可以绘制的图,但是如果你想从聚合数据中绘制一个箱形图,matplotlib有bxp()方法可以使用。请注意,它是一个Axes级别的函数(不能被称为plt.bxp)。它使用字典列表,其中每个字典包含有关特定箱线图的数据。然而,箱形图至少需要中位数、第一和第三四分位数,这不能从平均值、标准差等推断出来。而不需要进一步假设数据集的分布。假设数据集是正态分布的。然后,我们可以估计中位数,第一和第三四分位数使用平均值和标准差。使用这些值,我们还可以近似胡须。假设异常值不可用,我们可以绘制一个基本的箱形图,如下所示。
errorbar
bxp()
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);
字符串
的数据现在假设我们可以访问中位数,第一和第三四分位数(下面的median,q1,q3)。此外,假设我们可以访问刚好低于q1-(q3-q1)*1.5和刚好高于q3+(q3-q1)*1.5的值,这些值可用于定位晶须。此外,假设我们可以访问晶须(fliers)之外的值。然后将所有这些信息传递给bxp(),绘制一个与plt.boxplot绘制的图形完全相同的图形。
median
q1
q3
q1-(q3-q1)*1.5
q3+(q3-q1)*1.5
fliers
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);
2条答案
按热度按时间dfddblmv1#
上面@罗兰给出的答案很重要:箱形图显示的是完全不同的数量,如果使用现有数量绘制类似的图,可能会使用户感到困惑。我可能会使用堆叠误差条图来表示此信息。举例来说:
字符串
x1c 0d1x的数据
vmpqdwk32#
给定可用的信息(平均值,标准差,最小值,最大值),
errorbar
可能是唯一可以绘制的图,但是如果你想从聚合数据中绘制一个箱形图,matplotlib有bxp()
方法可以使用。请注意,它是一个Axes级别的函数(不能被称为plt.bxp
)。它使用字典列表,其中每个字典包含有关特定箱线图的数据。然而,箱形图至少需要中位数、第一和第三四分位数,这不能从平均值、标准差等推断出来。而不需要进一步假设数据集的分布。
假设数据集是正态分布的。然后,我们可以估计中位数,第一和第三四分位数使用平均值和标准差。使用这些值,我们还可以近似胡须。假设异常值不可用,我们可以绘制一个基本的箱形图,如下所示。
字符串
的数据
现在假设我们可以访问中位数,第一和第三四分位数(下面的
median
,q1
,q3
)。此外,假设我们可以访问刚好低于q1-(q3-q1)*1.5
和刚好高于q3+(q3-q1)*1.5
的值,这些值可用于定位晶须。此外,假设我们可以访问晶须(fliers
)之外的值。然后将所有这些信息传递给bxp()
,绘制一个与plt.boxplot
绘制的图形完全相同的图形。型
的
您可以验证上面的图是否与由绘制的图完全相同
型