设置轴范围时Matplotlib plt.hist2d的2D直方图无法完全填充底色
解决2D直方图固定轴范围后无法完全填充的问题
问题根源在于你先基于数据范围自动生成直方图的bin,再手动扩大轴范围,导致超出数据范围的区域没有对应bin,自然显示空白。要让直方图完全覆盖指定轴范围,必须在绘制hist2d时就指定bin的边界范围,而非依赖自动生成的bin。
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np X, Y = np.loadtxt('dihedral.txt', delimiter=',', unpack=True) # 手动指定x、y轴的bin边界,确保完全覆盖(0,360)和(90,180)范围 # linspace生成的边界点数量=bin数+1,这里保持200个bin和原代码一致 x_bins = np.linspace(0, 360, 201) y_bins = np.linspace(90, 180, 201) plt.hist2d(X, Y, bins=[x_bins, y_bins], cmap='jet') cb = plt.colorbar() cb.set_label('counts in bin') # 此时轴范围已由bin边界确定,无需再手动设置xlim/ylim(设置也不会有问题) # plt.ylim(90, 180) # plt.xlim(0, 360) plt.title('title') plt.xlabel('dihedral angle') plt.ylabel('angle of bend') plt.savefig('dihedral.png', dpi=300)
核心逻辑说明
- 原代码的
bins=200是让matplotlib根据数据的最小/最大值自动生成bin,后续扩大轴范围时,超出数据的区域没有对应bin,所以显示空白。 - 手动指定
bins=[x_bins, y_bins]后,bin会完全覆盖你需要的轴范围,即使某个bin无数据(计数为0),也会用颜色映射的最低值填充,实现整个图表被颜色覆盖的效果。 - 若要保持bin数量不变,
linspace的第三个参数设为「bin数+1」即可,比如200个bin对应201个边界点。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

