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
相关产品推荐
相关产品推荐

