Matplotlib中如何保持非均匀子图的原始尺寸(避免imshow()改变子图比例)
保持Matplotlib中Gridspec子图的宽高比不受imshow影响
问题的核心在于imshow()默认会强制将子图的宽高比设置为'equal'(目的是让图像的像素保持正方形),这会覆盖Gridspec原本为子图设定的尺寸比例。要恢复并保持ax3的原始尺寸,有几种简单的解决办法:
方法1:在imshow中直接指定aspect参数
在调用imshow()时,添加aspect='auto'参数,这样图像会自动拉伸以适应Gridspec设定的子图大小,而不会改变子图的宽高比:
2Ddata = np.arange(0, 10, 0.1).reshape(10, 10) # 加入aspect='auto'让图像适配子图尺寸 im = ax3.imshow(2Ddata, cmap='rainbow', aspect='auto')
方法2:提前设置子图的aspect属性
在创建ax3后,直接将其aspect设置为'auto',这样后续任何绘图操作(包括imshow)都不会改变子图的尺寸比例:
ax3 = fig.add_subplot(gs[12:20,0:11]) # 锁定子图宽高比为自动适配布局 ax3.set_aspect('auto') 2Ddata = np.arange(0, 10, 0.1).reshape(10, 10) im = ax3.imshow(2Ddata, cmap='rainbow')
方法3:恢复原始宽高比(可选)
如果你想先保留imshow的默认行为,之后再恢复子图的原始比例,可以先获取Gridspec布局下的原始aspect,绘制后再重置:
ax3 = fig.add_subplot(gs[12:20,0:11]) # 保存子图的原始宽高比 original_aspect = ax3.get_aspect() 2Ddata = np.arange(0, 10, 0.1).reshape(10, 10) im = ax3.imshow(2Ddata, cmap='rainbow') # 恢复原始宽高比 ax3.set_aspect(original_aspect)
完整修改后的代码示例
import numpy as np import matplotlib.pyplot as plt from matplotlib import gridspec # generate data x = np.arange(0, 10, 0.2) y = np.sin(x) # plot fig = plt.figure(figsize=(12, 9)) gs = gridspec.GridSpec(20, 20) ax1 = fig.add_subplot(gs[0:5,0:11]) ax1.plot(x, y) ax2 = fig.add_subplot(gs[6:11,0:11]) ax2.plot(y, x) ax3 = fig.add_subplot(gs[12:20,0:11]) ax3.set_aspect('auto') # 锁定子图尺寸 2Ddata = np.arange(0, 10, 0.1).reshape(10, 10) im = ax3.imshow(2Ddata, cmap='rainbow') ax4 = fig.add_subplot(gs[0:9,13:20]) ax4.plot(x, y) ax5 = fig.add_subplot(gs[11:20,13:20]) ax5.plot(y, x) plt.show()
这样修改后,ax3就会保持你最初用Gridspec设定的尺寸,不会因为绘制二维图像而变形。
内容的提问来源于stack exchange,提问作者Tobitobitobi
相关产品推荐
相关产品推荐

