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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:22:38