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

如何用Matplotlib让两个独立坐标轴的图形精准对齐?

解决Matplotlib Subplot Mosaic中子图条形水平对齐的问题

核心原因

两个子图的y轴刻度位置、条形的y坐标、y轴范围未统一,导致条形错位。堆叠条形图与普通水平条形图的y轴基准不一致,就会出现偏移。

具体实现方法

1. 创建布局时直接共享y轴

在初始化subplot_mosaic时设置sharey=True,让两个子图共享同一y轴,Matplotlib会自动统一两者的y轴刻度、范围,从根源避免错位。

示例创建代码:

fig, ax_dict = plt.subplot_mosaic([['a'], ['b']], sharey=True, figsize=(8, 6))

若布局为横向(如[['a', 'b']]),sharey=True同样适用,能保证y轴完全同步。

2. 统一条形的y坐标与高度

手动指定条形位置时,两个子图的y参数必须完全一致,同时height(条形高度)也要设为相同值,避免条形上下边界错位。

示例代码片段:

y_pos = np.arange(len(categories))
# 堆叠条形图的y位置与高度
ax_dict['a'].barh(y_pos, values1, height=0.6)
ax_dict['a'].barh(y_pos, values2, left=values1, height=0.6)
# 灰色条形图必须使用完全相同的y_pos与height
ax_dict['b'].barh(y_pos, gray_values, height=0.6, color='gray')

3. 手动同步y轴范围(备选方案)

若无法使用共享y轴,可获取其中一个子图的y轴范围,强制应用到另一个子图上:

# 获取堆叠条子图的y轴范围
y_min, y_max = ax_dict['a'].get_ylim()
# 将范围同步到灰色条子图
ax_dict['b'].set_ylim(y_min, y_max)

完整可运行示例

import matplotlib.pyplot as plt
import numpy as np

# 测试数据
categories = ['类别1', '类别2', '类别3']
values1 = [3, 5, 2]
values2 = [2, 1, 4]
gray_values = [6, 7, 5]

# 创建共享y轴的布局
fig, ax_dict = plt.subplot_mosaic([['a'], ['b']], sharey=True, figsize=(8, 5))

# 绘制堆叠水平条形图
y_pos = np.arange(len(categories))
ax_dict['a'].barh(y_pos, values1, height=0.6, label='系列1')
ax_dict['a'].barh(y_pos, values2, left=values1, height=0.6, label='系列2')
ax_dict['a'].set_yticks(y_pos)
ax_dict['a'].set_yticklabels(categories)
ax_dict['a'].legend()

# 绘制灰色水平条形图
ax_dict['b'].barh(y_pos, gray_values, height=0.6, color='gray')
ax_dict['b'].set_yticks(y_pos)
ax_dict['b'].set_yticklabels(categories)

plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:54:53