Matplotlib中imshow绘制网格子图列间存在空白的问题与解决
解决Matplotlib网格子图(imshow)列间空白问题
问题背景
使用Matplotlib绘制m行n列的网格子图,要求子图共享x/y轴且无任何空白间隔。使用plot函数时,通过以下代码可正常实现需求:
import matplotlib.pyplot as plt import numpy as np def plot_me(): n = 4 m = 5 f, axs = plt.subplots(m, n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0)) x = np.arange(44) for i in range(m): for j in range(n): axs[i,j].plot(np.sin(x*(i*j+1))) plt.show()
但将plot替换为imshow后,子图列间出现垂直空白(行间无空白),尝试f.subplots_adjust(wspace=0, hspace=0)及mosaic绘图方式均无法解决。当前环境:Python 3.11.2、VS Code 1.78.2、Matplotlib 3.7.1。
两种有效解决方案
方案1:使用pcolormesh替代imshow
imshow默认会自动调整轴的宽高比适配图像尺寸,这是导致子图间隙的核心原因。改用pcolormesh可规避该问题,代码示例:
import matplotlib.pyplot as plt import numpy as np def plot_me_imshow_fix(): n = 4 m = 5 f, axs = plt.subplots(m, n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0)) # 生成测试图像数据 img_data = np.random.rand(10,10) for i in range(m): for j in range(n): axs[i,j].pcolormesh(img_data, cmap='viridis') # 隐藏刻度线和标签(可选,优化布局整洁度) axs[i,j].set_xticks([]) axs[i,j].set_yticks([]) plt.show()
方案2:强制设置子图宽高比
通过set_aspect方法强制指定子图宽高比,让所有子图尺寸统一,消除列间隙。示例中设置为1.5(可根据自身图像尺寸调整):
import matplotlib.pyplot as plt import numpy as np def plot_me_imshow_fix(): n = 4 m = 5 f, axs = plt.subplots(m, n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0)) img_data = np.random.rand(10,10) for i in range(m): for j in range(n): axs[i,j].imshow(img_data, cmap='viridis') # 强制宽高比为1.5 axs[i,j].set_aspect(1.5) axs[i,j].set_xticks([]) axs[i,j].set_yticks([]) plt.show()
内容的提问来源于stack exchange,提问作者fffff
相关产品推荐
相关产品推荐

