python - 如何缩放具有不同频率的多个 KDE 图?
问题描述
我正在使用 Seaborn 绘制两个数据集的 KDE。但是这两个 KDE 都按比例缩小了。
我的代码:
sns.kdeplot(CDMX['EDAD'], shade=True)
sns.kdeplot(eduacion_superior['EDAD'], shade=True)
这给了我:
但我想让它们与它们所代表的数据成比例。所以,像:
有什么建议么?
解决方案
计数只能相对于某些垃圾箱有意义。据我所知,seaborn 的distplot可以显示带有计数的直方图,但是只要您还想要一个 kde,直方图和 kde 都会按比例缩小以获得总面积 1。
为了获得与所要求的相似的图,标准的 matplotlib 可以绘制一个用 Scipy 计算的 kde。要获得计数,必须决定如何对数据进行分箱,因为计数取决于相关直方图的分箱大小。最简单的方法是在 x 轴上每单位有一个箱(因此,每岁一个)。
这是一些示例代码。首先生成一些随机测试数据。然后绘制两个直方图,每个年龄都有一个 bin。在第二个图中,绘制了相同数据的 kde,并根据数据集的大小进行缩放。
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
cdmx_edad = np.random.chisquare(15, 10000)+10
ed_sup_edad = np.random.chisquare(20, 5000)+10
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
bins = np.arange(10,61,1)
ax1.hist(cdmx_edad, bins=bins, color='r', alpha=0.4, label='CDMX edad')
ax1.hist(ed_sup_edad, bins=bins, color='b', alpha=0.4, label='Educación superior edad')
ax1.legend()
cdmx_kde = stats.gaussian_kde(cdmx_edad)
ed_sup_kde = stats.gaussian_kde(ed_sup_edad)
x = np.linspace(10,61,500)
cdmx_curve = cdmx_kde(x)*cdmx_edad.shape[0]
ed_sup_curve = ed_sup_kde(x)*ed_sup_edad.shape[0]
# ax2.plot(x, cdmx_curve, color='r')
ax2.fill_between(x, 0, cdmx_curve, color='r', alpha=0.4, label='CDMX edad')
# ax2.plot(x, ed_sup_curve, color='b')
ax2.fill_between(x, 0, ed_sup_curve, color='b', alpha=0.4, label='Educación superior edad')
ax2.legend()
plt.show()
推荐阅读
- javascript - 如何在 map 函数中使用 async 和 await 进行顺序执行
- node.js - 我该如何解决这个错误?" 抛出新的 mongoose.Error.MissingSchemaError(name);?
- objective-c - iOS13 中 Method Swizzling 的 UISceneDelegate?
- javascript - 如何在javascript中同时获取所有元素ID?
- bash - 如何将此字符串转换为 Bash 中 Python 文件的可交互列表?
- angular - ngFor中带有角度7的动态主题标签并获得价值
- php - 如何在 LARAVEL 中隐藏 URL 变量
- c++ - 私有静态成员函数与私有成员函数
- authentication - 如何为单个 Exchange Online 邮箱启用 User.Read.All?
- pandas - 获取 pandas 时间序列图轴限制(不使用 x_compat=True)