概率函数直方图绘制与逆变换抽样空图问题排查
问题原因及修复方案
核心问题:重复的对数转换
你在plt.hist()中设置了log=True,同时又调用了plt.yscale('log'),这相当于对直方图的y值进行了两次对数转换,数值被压缩到几乎看不见的程度,因此呈现空图。
修复后的完整代码
import numpy as np import matplotlib.pyplot as plt # 补充缺失的绘图库导入 s_min = 1 s_max = 1000 # 计算归一化常数 C = 1 / (np.log(s_max) - np.log(s_min)) u = np.random.rand(int(1000000)) s = s_min * np.exp(u * (np.log(s_max) - np.log(s_min))) # 使用理论范围设置bins,避免抽样极值的微小偏差 a = np.log10(s_min) b = np.log10(s_max) mybins = np.logspace(a, b, num=17) # 移除hist中的log=True,保留yscale('log')即可 plt.hist(s, bins=mybins, density=True, histtype='step', label='Random Numbers') x = np.logspace(a, b, num=100) y = C / x plt.plot(x, y, 'r', label='Expected Distribution') plt.xlabel('s') plt.ylabel('P(s)') plt.xscale('log') plt.yscale('log') plt.legend() plt.show()
额外优化说明
- 补充
import matplotlib.pyplot as plt:这是使用plt绘图的必要前提,避免因未导入库导致的报错。 - 改用理论值设置bins范围:直接用
s_min和s_max计算对数刻度区间,比抽样得到的极值更稳定,避免随机抽样的波动影响bins的覆盖范围。
内容的提问来源于stack exchange,提问作者Галымжан Балтабай
相关产品推荐
相关产品推荐

