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

Python实现降水归一化体积密度分布:曲线积分归一化问题求助

修正降水归一化体积分布的积分归一化问题

我尝试利用降水数据复现论文《https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2012JD017979》中图8的分布图,该图Y轴为归一化体积(用于不同降水产品的分布密度对比),要求每条曲线下的面积积分等于1,但现有代码无法满足该要求。

现有代码的问题

当前计算分布的代码:

sim_dist = (sim_bin_cnt*sim_bin_means)/np.nansum(sim_bin_cnt)
obs_dist = (obs_bin_cnt*obs_bin_means)/np.nansum(obs_bin_cnt)

这里是将区间降水总量除以总样本数,得到的是单位样本的平均降水贡献,而非归一化的体积密度。因此乘以区间宽度求和后,结果无法等于1。

优雅的修正方案

要实现积分等于1,核心是将每个区间的体积占比除以区间宽度,得到体积密度(Y轴值)。具体步骤如下:

1. 优化统计计算(可选,减少重复调用)

合并两次binned_statistic调用,一次计算均值和计数:

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

# 一次计算均值和计数,避免重复运算
sim_stats, sim_bin_edges, sim_binnumber = stats.binned_statistic(
    x=sim_id, values=sim_id, statistic=['mean', 'count'],
    bins=2000, range=(0.01, 120)
)
sim_bin_means = sim_stats[0]
sim_bin_cnt = sim_stats[1]

obs_stats, obs_bin_edges, obs_binnumber = stats.binned_statistic(
    x=obs_id, values=obs_id, statistic=['mean', 'count'],
    bins=2000, range=(0.01, 120)
)
obs_bin_means = obs_stats[0]
obs_bin_cnt = obs_stats[1]

2. 计算归一化体积密度

以总体积(所有降水的总和)为基准,结合区间宽度计算密度:

# 计算总体积(所有降水数据的总和)
sim_total_volume = np.nansum(sim_id)
obs_total_volume = np.nansum(obs_id)

# 计算每个区间的宽度
sim_bin_widths = np.diff(sim_bin_edges)
obs_bin_widths = np.diff(obs_bin_edges)

# 计算归一化体积密度,确保积分=1
sim_dist = (sim_bin_cnt * sim_bin_means) / sim_total_volume / sim_bin_widths
obs_dist = (obs_bin_cnt * obs_bin_means) / obs_total_volume / obs_bin_widths

3. 验证积分结果

运行以下代码验证积分是否接近1:

print(np.nansum(sim_dist * sim_bin_widths))  # 输出应≈1
print(np.nansum(obs_dist * obs_bin_widths))  # 输出应≈1

4. 绘图(保留原逻辑,可优化X轴)

原绘图代码可直接使用,若要更准确,可改用区间中点作为X轴:

f, ax = plt.subplots()

# 可选:使用区间中点作为X轴
sim_bin_midpoints = (sim_bin_edges[:-1] + sim_bin_edges[1:]) / 2
obs_bin_midpoints = (obs_bin_edges[:-1] + obs_bin_edges[1:]) / 2

ax.plot(sim_bin_midpoints, sim_dist, c='r', label='SIM', lw=2, ls='-')
ax.plot(obs_bin_midpoints, obs_dist, c='k', label='OBS', lw=2, ls='--')

ax.set_xscale('log')
ax.legend(loc='best', frameon=False)
plt.show()

内容的提问来源于stack exchange,提问作者Kumah Kingsley Kwabena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:46:00