当我使用python库matplotlib
添加twinx
和/或twiny
轴时,指定长宽比的效果变得不一致:
- 当我在没有
twinx
/twiny
的情况下设置纵横比时,轴被放大(范围缩小)以实现所需的纵横比 - 当我添加
twinx
和/或twiny
轴时,结果取决于我添加twinx
和twiny
的顺序,以及是否需要收缩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
不适合这个应用程序,但我对我得到的结果感到惊讶。
1条答案
按热度按时间q9rjltbz1#
这不是一个真正的解释,但现在我将首先完成对原始轴的处理,然后添加双胞胎。这样至少行为是可预测的。