matplotlib绘制极小区间数据时调高bin数得到空直方图如何解决
问题原因
你的数据基准值为1,整体浮动范围仅为±5e-7,相对偏移只有百万分之一量级。当你提升bin数量时,单个bin的宽度会降低到1e-9甚至更低,要么是matplotlib自动计算bin边界时被双精度浮点数的精度误差干扰,要么是渲染时直方图的条形宽度趋近于0,最终呈现为空白图。对数刻度对该问题无效,因为你的数据是线性均匀分布的,不存在量级差异,对数缩放反而会放大精度问题。
解决方法
1. 数据偏移预处理
直接将所有原始数据减去基准值1,把数据转换为相对于1的偏移量,将分布区间平移到0附近,避免大基准值吃掉小范围浮动的精度:
import numpy as np import matplotlib.pyplot as plt # data为你的原始数据列表/数组 offset_data = np.array(data) - 1 fig, ax = plt.subplots() # 可自由设置bin数量,1000也可正常显示 n, bins, patches = ax.hist(offset_data, bins=1000) # x轴设置为科学计数法显示,方便读数 ax.ticklabel_format(axis='x', style='sci', scilimits=(0,0)) ax.set_xlabel('相对于1的偏移量') ax.set_ylabel('频数') plt.show()
2. 自定义bin边界(可选)
如果需要更精准的bin划分,可手动计算偏移后数据的范围,自定义bin边界,避免自动计算的误差:
min_offset = offset_data.min() max_offset = offset_data.max() # 1000个bin需要1001个边界点 custom_bins = np.linspace(min_offset, max_offset, 1001) n, bins, patches = ax.hist(offset_data, bins=custom_bins)
内容的提问来源于stack exchange,提问作者Eliran Turgeman
相关产品推荐
相关产品推荐

