如何在Matplotlib Mosaic中共享坐标轴标签与刻度?
解决Matplotlib Mosaic共享轴及刻度标签显示问题
错误原因
Matplotlib的subplot_mosaic不支持直接传入sharex/sharey参数——这些是subplot专属参数,传入mosaic后会被误解析为图形元素(比如Rectangle)的属性,所以触发AttributeError: 'Rectangle' object has no property 'sharex'。
解决步骤
1. 创建Mosaic网格并获取子图引用
先正常创建mosaic布局,拿到每个子图的对象:
import matplotlib.pyplot as plt # 定义mosaic布局,示例为2行2列:A B / C D fig = plt.figure(layout="constrained") axes = fig.subplot_mosaic([['A', 'B'], ['C', 'D']])
2. 手动设置轴共享
通过子图对象的sharex()/sharey()方法手动绑定共享轴,确保刻度统一:
# 所有子图共享A的y轴,保证y刻度一致 axes['B'].sharey(axes['A']) axes['C'].sharey(axes['A']) axes['D'].sharey(axes['A']) # 所有子图共享C的x轴,保证x刻度一致 axes['A'].sharex(axes['C']) axes['B'].sharex(axes['C']) axes['D'].sharex(axes['C'])
3. 控制刻度标签显示
根据需求隐藏不需要的刻度标签:
# 隐藏右侧子图(B、D)的y轴标签,只保留左侧A、C的 axes['B'].tick_params(axis='y', labelleft=False) axes['D'].tick_params(axis='y', labelleft=False) # 隐藏顶部子图(A、B)的x轴标签,只保留底部C、D的 axes['A'].tick_params(axis='x', labelbottom=False) axes['B'].tick_params(axis='x', labelbottom=False)
完整测试代码
import matplotlib.pyplot as plt import numpy as np # 创建mosaic布局 fig = plt.figure(layout="constrained") axes = fig.subplot_mosaic([['A', 'B'], ['C', 'D']]) # 设置轴共享 axes['B'].sharey(axes['A']) axes['C'].sharey(axes['A']) axes['D'].sharey(axes['A']) axes['A'].sharex(axes['C']) axes['B'].sharex(axes['C']) axes['D'].sharex(axes['C']) # 控制刻度标签显示 axes['B'].tick_params(axis='y', labelleft=False) axes['D'].tick_params(axis='y', labelleft=False) axes['A'].tick_params(axis='x', labelbottom=False) axes['B'].tick_params(axis='x', labelbottom=False) # 测试绘图 x = np.linspace(0, 10, 100) axes['A'].plot(x, np.sin(x)) axes['B'].plot(x, np.cos(x)) axes['C'].plot(x, np.tan(x[:-10])) axes['D'].plot(x, np.exp(-x/5)) plt.show()
内容的提问来源于stack exchange,提问作者Python_Learner
相关产品推荐
相关产品推荐

