You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Lets-Plot直方图中..density..计算结果不符的技术咨询

密度直方图计算结果不一致问题

我对密度直方图的理解是,第i个区间的密度计算方式为:

  • 区间频数为fᵢ
  • 样本量为n
  • 区间宽度为w
    密度dᵢ = (fᵢ / n)/w

在本次测试中,频数直方图和概率直方图的结果符合预期,但密度直方图不符。例如第1个区间频数为3,当n=20、w=0.1时,我预期密度为0.75(np.histogram的计算结果),但Lets-Plot绘制的结果显示为0.84。

请问是我对密度的理解有误、实现方式不正确,还是工具存在问题?

以下是复现问题的代码,使用的Lets-Plot版本为4.3.3:

import numpy as np
import pandas as pd
from lets_plot import *
LetsPlot.setup_html()

rng = np.random.default_rng(12345)

test = rng.normal(0, 1, (20, 2))
df = pd.DataFrame(test, columns=['A', 'B'])

plot_1 = (
    ggplot(df, aes(x='A')) +
    geom_histogram(binwidth=.2, fill='pink') +
    ggtitle('Frequency')
)

plot_2 = (
    ggplot(df, aes(x='A')) +
    geom_histogram(aes(y='..density..'),binwidth=.2, fill='pink') +
    ggtitle('Density')
)

plot_3 = (
    ggplot(df, aes(x='A')) +
    geom_histogram(aes(weight=np.ones_like(df.A) / len(df.A)),binwidth=.2, fill='pink') +
    ggtitle('Probability')
)

# 使用np.histogram计算相同分布,指定合适的分箱:
bins = np.arange(-1.56, 2.5, .2)
freq, edges = np.histogram(df.A,  bins=bins)
print('Numpy计算的分箱频数:')
print(f'{'分箱':^5s}{'频数':^5s}')
for i,f in enumerate(freq):
    print(f'{i+1:^5d}{f:^5d}')
print('')
    
plot_1.show()
plot_3.show()

dens, edges = np.histogram(df.A, density='True', bins=bins)
print('Numpy计算的分箱密度:')
print(f'{'分箱':^5s}{'密度':^9s}')
for i,d in enumerate(dens):
    print(f'{i+1:^5d}{d:^9.2f}')
print('')
plot_2.show()

Numpy计算的频数结果
Lets-Plot输出的频数、概率与Numpy密度结果
Lets-Plot绘制的密度直方图

内容的提问来源于stack exchange,提问作者RobertM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:12:38