如何用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
相关产品推荐
相关产品推荐

