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

Matplotlib中子图宽度固定方法求助

固定子图宽度(忽略颜色条)的解决方案

要解决同一列子图(含imshow带色条和plot)的宽度对齐问题,无需手动反复调试set_aspect,可以用以下两种实用方法:

方法1:GridSpec预留色条位置,精准控制主图宽度

通过matplotlib.gridspec.GridSpec拆分布局,给色条单独分配一列,让主图宽度完全独立于色条,和同列的plot子图对齐:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

# 创建画布
fig = plt.figure(figsize=(8, 6))

# 定义布局:2行,第一行拆分为主图+色条列,第二行为纯plot子图
gs = gridspec.GridSpec(2, 2, width_ratios=[10, 1], height_ratios=[1, 1])

# 第一行:imshow子图
ax_imshow = fig.add_subplot(gs[0, 0])
im = ax_imshow.imshow(np.random.rand(50, 100))  # 示例数据:y轴50像素,x轴100像素
# 基于数据比例设置box_aspect,保证图的比例正确,同时让宽度匹配plot子图
ax_imshow.set_box_aspect(0.5)  # 数值=数据y维度/数据x维度=50/100

# 添加色条到预留的单独列
cbar = fig.colorbar(im, cax=fig.add_subplot(gs[0, 1]))

# 第二行:plot子图,共享x轴
ax_plot = fig.add_subplot(gs[1, 0], sharex=ax_imshow)
ax_plot.plot(np.random.rand(100))

# 隐藏重复的x轴标签
plt.setp(ax_imshow.get_xticklabels(), visible=False)

plt.tight_layout()
plt.show()

方法2:constrained_layout + set_box_aspect自动对齐

利用constrained_layout自动管理布局,给imshow子图设置固定的box_aspect,让同列的plot子图自动继承宽度:

import matplotlib.pyplot as plt
import numpy as np

fig, (ax_imshow, ax_plot) = plt.subplots(2, 1, figsize=(8, 6), constrained_layout=True, sharex=True)

# 绘制imshow并设置box_aspect(基于数据的y/x比例)
im = ax_imshow.imshow(np.random.rand(50, 100))
ax_imshow.set_box_aspect(0.5)  # 数值=数据y维度/数据x维度=50/100

# 添加色条,用pad参数避免挤压主图宽度
cbar = fig.colorbar(im, ax=ax_imshow, pad=0.05)

# 绘制plot曲线
ax_plot.plot(np.random.rand(100))

plt.show()

关键要点

  • set_box_aspect的数值直接取数据的y轴像素数/x轴像素数,既能保证imshow的显示比例正确,又能让布局系统统一子图宽度。
  • GridSpec的width_ratios参数可灵活调整主图和色条的宽度占比,色条占比越小,对主图宽度的影响越低。
  • 开启sharex=True确保x轴范围一致,进一步强化子图的对齐效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:40:13