matplotlib 我如何使收缩/扩大,以实现纵横比表现一致,在twinx/twiny?

sqougxex  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(91)

当我使用python库matplotlib添加twinx和/或twiny轴时,指定长宽比的效果变得不一致:

  • 当我在没有twinx/twiny的情况下设置纵横比时,轴被放大(范围缩小)以实现所需的纵横比
  • 当我添加twinx和/或twiny轴时,结果取决于我添加twinxtwiny的顺序,以及是否需要收缩x轴或y轴。

下面是一个不一致行为的例子(左轴和右轴显示不同的限制)。当双轴添加为axes[1].twinx().twiny() xor y范围增加时,它将再次一致。
当我想预测我的代码做什么的时候,这让我有些头疼,这恰恰不是我使用Python的目的;)
是否有一种方法可以使其表现为预期的行为:即轴总是收缩,无论是否添加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),  # axes are the same when this range is larger, e.g. (10, 30)
        xlim=(20, 30),
    )

    # so the output below shows the final values
    ax.apply_aspect()
    print(ax.get_xlim())
    print(ax.get_ylim())

回复Guimoute的评论:好的观点,文档说我不应该这样做。然而,matplotlib并没有抱怨。当我将'datalim'更改为'box'时,我确实得到了RuntimeError: Adjustable 'box' is not allowed in a twinned Axes; use 'datalim' instead。(所以与文档建议的相反)。
如果我加上双轴

axes[1].twinx()
axes[1].twiny()

两种方法都有错误。
我对matplotlib试图给予孪生轴相同数量的刻度的建议感到好奇,并且对它们的限制的指定应该有影响;在下面的例子中,我没有看到这种情况发生。
在我的应用程序中,我当然会对孪生轴做更多的处理,为了保持示例简单,我把它省略了,但是不期望有匹配的刻度数。
我想到的应用程序是,例如,一组轴上的纬度/经度坐标和另一组轴上的北向/东向坐标。
下面是例子二:

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()

结果:

也许twinx/twiny不适合这个应用程序,但我对我得到的结果感到惊讶。

q9rjltbz

q9rjltbz1#

这不是一个真正的解释,但现在我将首先完成对原始轴的处理,然后添加双胞胎。这样至少行为是可预测的。

相关问题