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

Matplotlib共享X轴子图与散点图色条对齐问题求解

解决方案:自动适配共享X轴与散点图色条的布局

针对共享X轴的子图添加色条后布局错位的问题,可通过make_axes_locatable配合tight_layout实现自动适配,无需手动估算参数,多列场景也能生效。

核心实现代码

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

# 生成测试数据
x = np.linspace(0, 10, 100)
line_data = np.sin(x)
scatter_y = np.random.rand(100)
scatter_color = np.random.rand(100)

# 创建共享X轴的上下子图,关闭constrained_layout避免自动加大间距
fig, (ax_line, ax_scatter) = plt.subplots(2, 1, sharex=True, figsize=(8, 6), constrained_layout=False)

# 绘制上方折线图
ax_line.plot(x, line_data)
ax_line.set_ylabel('折线图')

# 绘制下方散点图
scatter_plot = ax_scatter.scatter(x, scatter_y, c=scatter_color, cmap='viridis')
ax_scatter.set_xlabel('X轴')
ax_scatter.set_ylabel('散点图')

# 自动分割散点图轴,在右侧生成色条轴
divider = make_axes_locatable(ax_scatter)
cax = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(scatter_plot, cax=cax)

# 自动调整布局,保证上方子图宽度匹配散点图+色条的整体宽度
plt.tight_layout()

plt.show()

多列子图场景适配

如果是多列布局(每列包含上下子图+色条),只需按列重复逻辑,tight_layout会自动处理全局适配:

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

x = np.linspace(0, 10, 100)
line_data1 = np.sin(x)
line_data2 = np.cos(x)
scatter_y = np.random.rand(100)
scatter_color = np.random.rand(100)

# 2列布局,每列子图共享X轴
fig, axs = plt.subplots(2, 2, sharex='col', figsize=(12, 6), constrained_layout=False)

# 第一列
ax_line1 = axs[0, 0]
ax_line1.plot(x, line_data1)
ax_line1.set_ylabel('折线图')

ax_scatter1 = axs[1, 0]
scatter1 = ax_scatter1.scatter(x, scatter_y, c=scatter_color, cmap='viridis')
ax_scatter1.set_xlabel('X轴')
ax_scatter1.set_ylabel('散点图')

divider1 = make_axes_locatable(ax_scatter1)
cax1 = divider1.append_axes("right", size="5%", pad=0.05)
fig.colorbar(scatter1, cax=cax1)

# 第二列
ax_line2 = axs[0, 1]
ax_line2.plot(x, line_data2)
ax_line2.set_ylabel('折线图')

ax_scatter2 = axs[1, 1]
scatter2 = ax_scatter2.scatter(x, scatter_y+0.5, c=scatter_color, cmap='plasma')
ax_scatter2.set_xlabel('X轴')
ax_scatter2.set_ylabel('散点图')

divider2 = make_axes_locatable(ax_scatter2)
cax2 = divider2.append_axes("right", size="5%", pad=0.05)
fig.colorbar(scatter2, cax=cax2)

plt.tight_layout()
plt.show()

关键细节说明

  • make_axes_locatable:自动将散点图的坐标轴分割,按比例生成色条轴,无需手动计算宽度参数
  • sharex='col':确保同列子图严格共享X轴,添加色条后不会破坏轴对齐
  • tight_layout():自动调整所有元素的位置和间距,保证上方子图宽度完全匹配下方散点图+色条的整体宽度,同时避免不必要的大间距
  • 若需微调整体间距,可在tight_layout中传入pad参数(如plt.tight_layout(pad=0.5))控制留白

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:18:19