如何在使用weight参数的直方图中创建KDE(密度图)
用带权重的直方图聚合条形数据
没问题!你手里有一组带非连续非整数索引的Series数据,想要把它们按区间聚合求和做成直方图,用plt.hist()的weight参数就能完美实现这个需求。
首先先回顾你的原始数据生成代码:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 生成原始数据 x = np.array([1, 2, 3.1, 3.2, 4.1, 4.2, 4.3, 5, 6, 7]) y = np.random.rand(10) s = pd.Series(y, index=x) # 查看数据内容 print(s)
输出内容如下:
1.0 0.895835
2.0 0.117966
3.1 0.397263
3.2 0.669877
4.1 0.330271
4.2 0.664608
4.3 0.006288
5.0 0.671697
6.0 0.587998
7.0 0.809034
dtype: float64
接下来是核心的直方图实现代码,关键就是通过weights参数指定每个数据点的权重为Series的数值,这样直方图会自动计算每个区间内的权重总和:
# 定义直方图的区间,这里按整数划分,区间为[1,2), [2,3), ..., [6,7] bins = np.arange(1, 8, 1) # 绘制加权直方图:传入索引作为x数据,weights指定为Series的数值 n, bins, patches = plt.hist(s.index, bins=bins, weights=s.values, edgecolor='black') # 添加可视化装饰 plt.title('区间内数值求和直方图') plt.xlabel('区间') plt.ylabel('数值总和') # 可选:在每个条形上方标注精确的求和值 for i in range(len(n)): plt.text(bins[i] + 0.5, n[i] + 0.02, f'{n[i]:.2f}', ha='center') # 显示图像 plt.show()
关键参数说明
s.index:作为直方图的原始x轴数据,也就是我们要进行分组的数值weights=s.values:这是实现求和的核心!默认直方图会统计每个区间内的数据点数量,而设置weights后,会把每个数据点对应的权重(也就是你的y值)相加,得到区间的总和bins:你可以根据需求调整区间划分,比如想要更细的0.5步长区间,就改成np.arange(1, 7.5, 0.5),这样就能把3.1和3.2分到同一个[3,3.5)区间里
内容的提问来源于stack exchange,提问作者Stephen Zhou




