使用divider.append_axes实现多子图共用色条的布局问题求助
解决共用色条高度对齐与右上子图位置问题
核心修改点
- 放弃从子图衍生色条的方式,手动创建色条坐标轴,精准控制其高度覆盖上下两排子图
- 调整子图布局参数,修正右上子图的位置偏移
完整修改代码
import numpy as np import matplotlib.pyplot as plt arr = np.random.random((4,10,10)) fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True, figsize=(10.1,10)) # 微调子图横向间距,避免过度重叠导致子图偏移 fig.subplots_adjust(left=0.04, bottom=0.1, right=0.9, top=0.9, wspace=-0.18, hspace=0.01) for i in range(2): for j in range(2): c = axes[i,j].imshow(arr[2*i+j,:,:].T, cmap='cool', aspect='equal', origin='lower') axes[i,j].tick_params(axis='both', which='major', length=5, width=1, labelsize=20, direction='in') axes[i,j].tick_params(axis='both', which='minor', length=3, width=1, direction='in') axes[i,j].minorticks_on() axes[i,j].yaxis.set_ticks_position('both') axes[i,j].xaxis.set_ticks_position('both') # 移除手动强制设置aspect的代码,imshow的aspect='equal'结合sharex/sharey可自动协调子图比例,避免位置偏移 # 手动创建色条坐标轴:参数为[左边界, 下边界, 宽度, 高度],基于子图位置计算 top_ax_pos = axes[0,0].get_position() bottom_ax_pos = axes[1,0].get_position() # 让色条高度覆盖从顶部子图上沿到底部子图下沿,位置固定在子图右侧 cax = fig.add_axes([0.92, bottom_ax_pos.y0, 0.025, top_ax_pos.y1 - bottom_ax_pos.y0]) cb = plt.colorbar(c, cax=cax) cb.set_label(r'$x/y$', fontsize=16) cb.ax.tick_params(labelsize=16) plt.savefig('plot.png')
关键说明
- 色条高度控制:通过
fig.add_axes()手动定义色条的位置和尺寸,利用子图的get_position()获取上下边界坐标,让色条高度完全覆盖两排子图,精准对齐顶部子图上沿。 - 右上子图位置修正:
- 删除手动设置
aspect的代码,imshow的aspect='equal'结合sharex/sharey可自动维持子图比例,避免强制调整引发的布局错乱。 - 微调
wspace参数(从-0.2改为-0.18),在保持子图紧凑布局的同时,避免过度重叠导致的子图偏移。
- 删除手动设置
内容的提问来源于stack exchange,提问作者DrMittal
相关产品推荐
相关产品推荐

