You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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')

关键说明

  1. 色条高度控制:通过fig.add_axes()手动定义色条的位置和尺寸,利用子图的get_position()获取上下边界坐标,让色条高度完全覆盖两排子图,精准对齐顶部子图上沿。
  2. 右上子图位置修正:
    • 删除手动设置aspect的代码,imshow的aspect='equal'结合sharex/sharey可自动维持子图比例,避免强制调整引发的布局错乱。
    • 微调wspace参数(从-0.2改为-0.18),在保持子图紧凑布局的同时,避免过度重叠导致的子图偏移。

内容的提问来源于stack exchange,提问作者DrMittal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:17:03