为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用类似 KDnuggets 样式的 PDF 绘制比较箱线图

如何使用类似 KDnuggets 样式的 PDF 绘制比较箱线图

慕容708150 2023-05-16 09:48:17
在阅读KDnuggets 文章中的了解箱线图时。我找到了带有概率密度函数的 Boxplot 的详细图 (pdf)我正在尝试绘制比较箱线图和概率密度函数(pdf),如下图所示我知道单独绘制基本箱线图和pdf 。我对可视化的了解是最少的。我不是在问上面情节的精确复制,非常感谢有细节的类似情节。我乐于接受新的想法和方法,并希望在开始之前试探一下如果是,是否可以用 Python 绘制上面的图,将使用哪个包来绘制上面的图?有人可以阐明用 Python 绘制上述图吗?我很乐意收到您的任何线索。
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

这是重新创建情节的图形元素的尝试。使用一些随机数据而不是完美的正态分布,因此您可以插入自己的数据。(要获得更完美的曲线,请生成更多数量的样本。)


from matplotlib import pyplot as plt

import numpy as np

import seaborn as sns


x = np.random.normal(0, 1, 1000)

mean = x.mean()

std = x.std()

q1, median, q3 = np.percentile(x, [25, 50, 75])

iqr = q3 - q1


fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)


medianprops = dict(linestyle='-', linewidth=2, color='yellow')

sns.boxplot(x=x, color='lightcoral', saturation=1, medianprops=medianprops,

            flierprops={'markerfacecolor': 'mediumseagreen'}, whis=1.5, ax=ax1)


ticks = [mean + std * i for i in range(-4, 5)]

ticklabels = [f'${i}\\sigma$' for i in range(-4, 5)]

ax1.set_xticks(ticks)

ax1.set_xticklabels(ticklabels)

ax1.set_yticks([])

ax1.tick_params(labelbottom=True)

ax1.set_ylim(-1, 1.5)

ax1.errorbar([q1, q3], [1, 1], yerr=[-0.2, 0.2], color='black', lw=1)

ax1.text(q1, 0.6, 'Q1', ha='center', va='center', color='black')

ax1.text(q3, 0.6, 'Q3', ha='center', va='center', color='black')

ax1.text(median, -0.6, 'median', ha='center', va='center', color='black')

ax1.text(median, 1.2, 'IQR', ha='center', va='center', color='black')

ax1.text(q1 - 1.5*iqr, 0.4, 'Q1 - 1.5*IQR', ha='center', va='center', color='black')

ax1.text(q3 + 1.5*iqr, 0.4, 'Q3 + 1.5*IQR', ha='center', va='center', color='black')

# ax1.vlines([q1 - 1.5*iqr, q1, q3, q3 + 1.5*iqr], 0, -2, color='darkgrey', ls=':', clip_on=False, zorder=0)


sns.kdeplot(x, ax=ax2)

kdeline = ax2.lines[0]

xs = kdeline.get_xdata()

ys = kdeline.get_ydata()


ylims = ax2.get_ylim()

ax2.fill_between(xs, 0, ys, color='mediumseagreen')

ax2.fill_between(xs, 0, ys, where=(xs >= q1 - 1.5*iqr) & (xs <= q3 + 1.5*iqr), color='skyblue')

ax2.fill_between(xs, 0, ys, where=(xs >= q1) & (xs <= q3), color='lightcoral')

# ax2.vlines([q1 - 1.5*iqr, q1, q3, q3 + 1.5*iqr], 0, 100, color='darkgrey', ls=':', zorder=0)

ax2.set_ylim(0, ylims[1])

plt.show()

//img1.sycdn.imooc.com//6462e1020001540806570309.jpg

一些评论:

  • 中位数和均值通常不重合,因此 0 西格玛可能会偏离中线。

  • Matplotlib 在最接近计算的Q1 - 1.5 IQR和 的数据点绘制胡须Q3 + 1.5 IQR,因此当点数不多时,胡须的位置可能会有点偏离。

  • 对于真实数据,分布很少看起来像完美的钟形曲线。

以下是 100 万个样本的示例:

//img1.sycdn.imooc.com//6462e10e0001ebe806570273.jpg

查看完整回答
反对 回复 2023-05-16
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信