如何移除matplotlib中imshow子图间的水平空白间距
问题描述
需要移除3个垂直排列子图之间的空白间距,已尝试使用gridspec.GridSpec和fig.subplots_adjust两种方法调整参数均未生效,调整过程中需要保留每个子图现有的独立右侧色条。
原实现代码如下:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locatable # 生成随机测试数据 x1 = np.random.rand(1,10) x2 = np.random.rand(1,10) x3 = np.random.rand(1,10) nrow, ncol = 3, 1 fig, axes = plt.subplots(nrow,ncol, figsize=(12,8)) fig.subplots_adjust(wspace=0.01, hspace=0.01) axes = axes.flatten() cmaps = ['Greens_r', 'Reds', 'jet'] x_all = [x1,x2,x3] for i in range(3): im = axes[i].imshow(x_all[i], cmap=cmaps[i]) axes[i].set_xticklabels([]) axes[i].set_yticklabels([]) axes[i].set_xticks([]) axes[i].set_yticks([]) # 在子图右侧创建色条轴 divider = make_axes_locatable(axes[i]) cax = divider.append_axes("right", size="5%", pad=0.05) fig.colorbar(im, cax=cax)
当前运行效果参考:
实现方法
之前间距设置不生效的核心原因是imshow默认会强制子图保持和输入数据匹配的固定宽高比,subplots_adjust的间距参数无法覆盖这个自动布局规则,只需两步调整即可实现零间距效果:
- 调用
imshow时新增aspect='auto'参数,解除子图的固定宽高比限制,允许子图拉伸填充画布分配的空间 - 保留
hspace=0的间距设置,可根据需要微调上下边距避免内容裁切
优化后(增加相邻边框隐藏避免线条重叠)的完整代码:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locatable # 生成随机测试数据 x1 = np.random.rand(1,10) x2 = np.random.rand(1,10) x3 = np.random.rand(1,10) nrow, ncol = 3, 1 fig, axes = plt.subplots(nrow,ncol, figsize=(12,8)) # 设置垂直方向子图间距为0,调整top/bottom参数避免边缘内容裁切 fig.subplots_adjust(wspace=0, hspace=0, top=0.95, bottom=0.05) axes = axes.flatten() cmaps = ['Greens_r', 'Reds', 'jet'] x_all = [x1,x2,x3] for i in range(3): # 新增aspect='auto'解除固定宽高比限制 im = axes[i].imshow(x_all[i], cmap=cmaps[i], aspect='auto') axes[i].set_xticklabels([]) axes[i].set_yticklabels([]) axes[i].set_xticks([]) axes[i].set_yticks([]) # 隐藏相邻子图的重叠边框,避免线条变粗 if i != nrow -1: axes[i].spines['bottom'].set_visible(False) if i != 0: axes[i].spines['top'].set_visible(False) # 在子图右侧创建独立色条轴 divider = make_axes_locatable(axes[i]) cax = divider.append_axes("right", size="5%", pad=0.05) fig.colorbar(im, cax=cax) plt.show()
运行后三个子图会完全贴合无空白,同时每个子图保留独立的右侧色条。
内容的提问来源于stack exchange,提问作者seralouk
相关产品推荐
相关产品推荐

