Matplotlib hist2d输出解包异常:绘图出现奇怪蓝框求助
问题原因分析
你碰到的蓝框问题,核心在于**plt.imshow()和plt.hist2d()的默认坐标轴设置不匹配**:
plt.hist2d()生成的直方图,x、y轴的实际范围由返回的xe(x轴区间边)和ye(y轴区间边)决定,而且它默认的坐标轴原点在左下角,和常规数据可视化的方向一致。- 但
plt.imshow()的默认行为是把图像原点放在左上角,并且会用数组的索引当作坐标,不会自动适配hist2d输出的真实数据范围,这就导致显示区域和实际数据范围错位,出现的蓝框其实是超出有效数据的空白区域。
解决方案
要让imshow正确显示hist2d生成的M矩阵,需要手动指定三个关键参数来对齐设置:
extent:用xe和ye定义图像的显示范围,格式为[xe的最小值, xe的最大值, ye的最小值, ye的最大值]origin:设置为'lower',和hist2d的坐标轴方向保持一致aspect:设置为'auto',避免图像被强制拉伸成正方形(hist2d默认会根据数据范围自动调整宽高比)
修正后的代码如下:
import matplotlib.pyplot as plt from matplotlib.colors import LogNorm import numpy as np traj = np.loadtxt('trajectory.txt') x = traj[:,0] y = traj[:,1] M, xe, ye, img = plt.hist2d(x, y, bins = 80, norm = LogNorm()) # 调整imshow参数匹配hist2d的设置 plt.imshow(M, extent=[xe[0], xe[-1], ye[0], ye[-1]], origin='lower', aspect='auto', norm=LogNorm()) plt.colorbar() # 可选,加上和hist2d默认一致的颜色条 plt.show()
另外,如果你只是想拿到解包后的M、xe、ye做后续分析,同时保留hist2d的原生显示效果,还有更省事的方式:直接复用返回的img对象做调整,不用重新调用imshow。比如:
M, xe, ye, img = plt.hist2d(x, y, bins = 80, norm = LogNorm()) # 可以直接对img做自定义修改,比如更换颜色映射 img.set_cmap('plasma') plt.show()
这样既能拿到所需的计算结果,又能保证显示效果和直接调用hist2d完全一致。
内容的提问来源于stack exchange,提问作者Simone Bolognini
相关产品推荐
相关产品推荐

