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

使用subplot_mosaic与make_axes_locatable时Matplotlib色条及保存比例问题

问题解决方案

1. 修复Colorbar刻度与标题不显示的问题

constrained_layout=True 和 make_axes_locatable 混用会导致新添加的colorbar轴(cax)未被布局系统正确识别,进而被挤出画布。可以通过以下调整解决:

  • 在创建colorbar时,明确关联当前figure而非使用全局plt.colorbar
  • 触发一次画布重绘,让布局系统重新计算所有轴的位置

修改后的plot2d函数:

def plot2d(data, ax, fig):
    im = ax.imshow(data, aspect="auto")

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%", pad=0.05)
    # 关联当前figure创建colorbar,避免全局上下文冲突
    fig.colorbar(im, cax=cax, label="DATA")
    # 强制更新布局,让constrained_layout识别新添加的colorbar轴
    fig.canvas.draw()

2. 保存时保留5:7的纵横比

bbox_inches="tight" 会自动裁剪空白并调整图像尺寸,破坏原本设置的5x7英寸比例。直接移除该参数即可严格保留设定的纵横比;如果需要减少空白,可以调整constrained_layout_pad参数控制布局内边距。

完整修改代码

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable


def plot2d(data, ax, fig):
    im = ax.imshow(data, aspect="auto")

    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%", pad=0.05)
    fig.colorbar(im, cax=cax, label="DATA")
    fig.canvas.draw()


fig = plt.figure(constrained_layout=True)
fig.set_size_inches(5, 7)
ax_dict = fig.subplot_mosaic([["D1"]])
ax = ax_dict["D1"]

plot2d(np.random.rand(10, 1000), ax, fig)
# 移除bbox_inches="tight"以保留设定的纵横比
plt.savefig("foo3.pdf", dpi=100)

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:53:43