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

Matplotlib中2D等高线图与1D子图的X轴对齐共享及色条问题

解决等高线图+1D子图X轴对齐+色条布局问题

我太懂你这个痛点了——色条总抢子图空间,导致上下X轴对不齐,真的很闹心!核心问题就是默认的色条布局会压缩主图宽度,和下面的1D子图宽度不一致,自然对齐不了。下面给你两种靠谱的解决办法,都能让色条乖乖待在自己的位置,保证上下X轴完美对齐,还能保留色条图例。

方法一:用GridSpec精准划分布局

如果你想完全掌控每个区域的尺寸比例,直接给色条单独分配一列就好:

import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 取Y=0的1D路径数据
z_1d = Z[50, :]

# 创建GridSpec:2行2列,第一列放主图和1D子图,第二列给色条,宽度比例1:0.05
gs = plt.GridSpec(2, 2, width_ratios=[1, 0.05], height_ratios=[3, 1])

# 绘制等高线图
ax_contour = plt.subplot(gs[0, 0])
contour_plot = ax_contour.contourf(X, Y, Z, cmap='viridis')
ax_contour.set_ylabel('Y Axis')

# 绘制1D子图,直接共享主图的X轴
ax_1d = plt.subplot(gs[1, 0], sharex=ax_contour)
ax_1d.plot(x, z_1d, color='red')
ax_1d.set_xlabel('X Axis')
ax_1d.set_ylabel('1D Value')

# 把色条放在单独的列里
cbar_ax = plt.subplot(gs[0, 1])
plt.colorbar(contour_plot, cax=cbar_ax)

# 自动调整布局避免重叠
plt.tight_layout()
plt.show()

这里的关键是width_ratios参数,给色条留了窄窄的一列,主图和1D子图都在同一列里,宽度完全一致,X轴自然就对齐了。

方法二:用make_axes_locatable拆分主图空间

如果不想手动分网格,这个方法更灵活,直接从主图的右边拆分出一小块放色条:

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

# 同样的示例数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
z_1d = Z[50, :]

# 创建上下两个子图,直接共享X轴,设置高度比例
fig, (ax_contour, ax_1d) = plt.subplots(2, 1, sharex=True, figsize=(8, 6), gridspec_kw={'height_ratios': [3, 1]})

# 绘制等高线图
contour_plot = ax_contour.contourf(X, Y, Z, cmap='viridis')
ax_contour.set_ylabel('Y Axis')

# 绘制1D路径
ax_1d.plot(x, z_1d, color='red')
ax_1d.set_xlabel('X Axis')
ax_1d.set_ylabel('1D Value')

# 拆分主图的坐标轴,在右边加一个色条专用的小坐标轴
divider = make_axes_locatable(ax_contour)
cbar_ax = divider.append_axes("right", size="5%", pad=0.1)
plt.colorbar(contour_plot, cax=cbar_ax)

plt.tight_layout()
plt.show()

这个方法里,make_axes_locatable会把主图的空间拆分,色条占的是主图额外延伸的空间,不会压缩主图本身的宽度,所以下面的1D子图和主图宽度完全一致,X轴对齐没毛病。

两种方法都能解决你的问题,选哪个看你对布局的掌控需求——想精准控比例就用GridSpec,想省事就用拆分坐标轴的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:53:52