如何让matplotlib中twinx/twiny的宽高比缩放/扩展行为一致?
Matplotlib双轴(twinx/twiny)与宽高比设置的不一致问题
问题现象
- 未添加twinx/twiny时,轴会自动放大(数据范围缩小)以匹配指定的宽高比
- 添加twinx/twiny后,最终显示效果取决于双轴的添加顺序,以及x轴或y轴是否需要缩小范围
存在特殊情况:当以axes[1].twinx().twiny()链式方式添加双轴,或者扩大y轴范围时,双轴与原轴的行为会恢复一致;但常规添加双轴时,结果完全不可预测。
需求
无论是否添加twinx/twiny,轴始终保持缩小数据范围的行为;若能显式选择是缩小还是扩展数据范围的模式则更佳。
示例代码与现象
基础不一致示例
import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2) axes[1].twinx().twiny() for ax in axes: ax.grid(True) ax.set( aspect=1, adjustable='datalim', ) ax.set( ylim=(10, 20), # 当y范围扩大为(10,30)时,两个轴的表现会一致 xlim=(20, 30), ) # 输出最终的轴范围值 ax.apply_aspect() print(ax.get_xlim()) print(ax.get_ylim())
运行后左右两个子图的轴范围不一致,控制台输出的xlim、ylim也存在差异。
实际应用场景示例
实际场景中一组轴显示经纬度坐标,另一组显示北距/东距坐标,代码如下:
import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2) twiny = axes[1].twiny() twiny.set(xlim=(0, .8)) for ax in axes: ax.grid(True) ax.set( aspect=1, adjustable='datalim', ) ax.set( ylim=(10, 30), xlim=(20, 30), ) ax.apply_aspect()
添加twiny后,轴的显示结果超出预期。
补充说明
- 官方文档不推荐此类操作,但Matplotlib未抛出错误;若将
adjustable设置为'box',会触发RuntimeError,提示双轴需使用'datalim'模式 - 若分开调用
axes[1].twinx()和axes[1].twiny(),两种方式都会报错
内容的提问来源于stack exchange,提问作者Roel
相关产品推荐
相关产品推荐

