使用颜色映射填充子图:Matplotlib的LogNorm在Python 3中无法正常工作
解决Matplotlib LogNorm在Python3中与imshow配合的显示问题
我来帮你搞定这个问题!你遇到的情况是因为Python3版本的Matplotlib中,imshow的坐标映射逻辑和Python2.7有细微调整,再加上它本身更适合像素网格类的图像显示,和对数坐标轴的适配性不如专门的网格绘图函数。下面给你两种解决方案:
方案一:改用pcolormesh(推荐)
pcolormesh是为非均匀坐标(比如对数刻度)设计的填充绘图函数,能完美匹配你的需求。修改后的代码如下:
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LogNorm fig = plt.figure() ax = fig.add_subplot(111) # 创建对数间距值 x = np.logspace(-8,-3,6) yarr = np.vstack((x,)) print(yarr) ax.plot(yarr, [1e1]*len(yarr), 'w.-') # 定义坐标边界:x方向比数据多一个点,y方向对应你设置的extent范围 x_edges = np.logspace(-8, -3, 7) y_edges = np.array([1, 1e4]) # 绘制填充区域并添加颜色条 mesh = ax.pcolormesh(x_edges, y_edges, yarr, norm=LogNorm(vmin=1e-8, vmax=1e-3)) fig.colorbar(mesh, ax=ax) ax.set_xscale("log") ax.set_yscale("log") plt.show()
为什么这个方案更好?
imshow默认把数据当成像素矩阵,每个元素对应一个固定大小的像素块,当坐标轴是对数刻度时,这种线性的像素映射会导致显示错位。而pcolormesh完全基于你提供的坐标边界来生成网格,和对数坐标轴的缩放逻辑完全匹配,结果更符合预期。
方案二:调整imshow的参数(如果坚持用imshow)
如果你一定要保留imshow,可以通过调整origin和aspect参数让它适配对数坐标轴:
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LogNorm fig = plt.figure() ax = fig.add_subplot(111) x = np.logspace(-8,-3,6) yarr = np.vstack((x,)) print(yarr) ax.plot(yarr, [1e1]*len(yarr), 'w.-') # 添加origin='lower'匹配y轴从小到大的对数刻度,aspect='auto'避免强制正方形像素 ax.imshow(yarr, extent=(1e-8, 1e-3, 1, 1e4), norm=LogNorm(vmin=1e-8, vmax=1e-3), origin='lower', aspect='auto') # 可选:添加颜色条 fig.colorbar(ax.images[0], ax=ax) ax.set_xscale("log") ax.set_yscale("log") plt.show()
参数说明:
origin='lower':Python3中imshow默认origin='upper',也就是数据的第一行对应图像顶部,但你的y轴是从1(小)到1e4(大),设置成lower能让数据和y轴方向对齐。aspect='auto':取消imshow默认的正方形像素限制,让填充区域自适应坐标轴的对数缩放比例。
内容的提问来源于stack exchange,提问作者user9487487
相关产品推荐
相关产品推荐

