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

Matplotlib固定子图宽高比后颜色条高度异常的问题求助

解决方案

当你给子图设置box_aspect后,constrained布局会调整子图的实际尺寸以满足宽高比,默认的colorbar高度计算逻辑会失效,导致颜色条过高。以下是两种可行的解决方法:

方法一:使用GridSpec构建布局(推荐)

通过GridSpec将颜色条作为单独的一列,让它跨越两行子图,完美匹配整个子图区域的高度,同时保留constrained布局的自动调整特性:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(layout='constrained')
# 创建2行3列的网格,第三列用于放置颜色条,宽度比例设为0.05
gs = fig.add_gridspec(2, 3, width_ratios=[1, 1, 0.05])

# 创建2×2的子图网格
axes = []
for i in range(2):
    row_axes = []
    for j in range(2):
        ax = fig.add_subplot(gs[i, j])
        row_axes.append(ax)
    axes.append(row_axes)
axes = np.array(axes)

# 绘制子图并设置宽高比
for ax in axes.flat:
    stuff = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
    ax.set_box_aspect(1/2)

# 创建颜色条轴,跨越两行
cax = fig.add_subplot(gs[:, 2])
fig.colorbar(stuff, cax=cax)

plt.show()

方法二:手动调整颜色条轴的高度

利用mpl_toolkits.axes_grid1工具,先获取右侧子图的边界,再调整颜色条轴的高度以覆盖两行子图:

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

fig, axes = plt.subplots(nrows=2, ncols=2, layout='constrained')

for ax in axes.flat:
    stuff = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
    ax.set_box_aspect(1/2)

# 获取右侧一列的两个子图
right_axes = axes[:, 1]
# 基于右下角子图创建颜色条轴
divider = make_axes_locatable(right_axes[1])
cax = divider.append_axes("right", size="5%", pad=0.1)

# 调整颜色条轴的高度,使其匹配两行子图的总高度
cax.set_ylim(right_axes[0].get_ylim()[0], right_axes[1].get_ylim()[1])
fig.colorbar(stuff, cax=cax)

plt.show()

这两种方法都能让颜色条高度与整个2×2子图网格的高度保持一致,同时兼容box_aspect的设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:27:46