You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在使用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

火山引擎 最新活动