Matplotlib设置x轴限制后,y轴限制没有更新?

9
我正在尝试绘制一些数据的子集,但在设置x轴限制后,y轴限制没有被正确更新。有没有办法让matplotlib在设置x轴限制后更新y轴限制?
例如,考虑以下图表:
import numpy
import pylab
pylab.plot(numpy.arange(100)**2.0)

这会给出:完整范围图1

这样做是可以的。然而,如果我只想查看从x=0到x=10的部分,则y轴缩放会出现问题:

pylab.plot(numpy.arange(100)**2.0)
pylab.xlim(0,10)

这将显示:Plot 1 subset

在前一种情况下,x轴和y轴被正确缩放,在后一种情况下,即使数据未绘制,y轴仍然保持相同的缩放。如何告诉matplotlib更新y轴缩放?

明显的解决方法是仅绘制数据子集,或通过检查数据手动重置y轴限制,但这两种方法都相当麻烦。

更新:

上面的示例是简化的,在更一般的情况下,有:

pylab.plot(xdata, ydata1)
pylab.plot(xdata, ydata2)
pylab.plot(xdata, ydata3)
pylab.xlim(xmin, xmax)

当然可以手动设置y轴范围。

subidx = N.argwhere((xdata >= xmin) & (xdata <= xmax))
ymin = N.min(ydata1[subidx], ydata2[subidx], ydata3[subidx])
ymax = N.max(ydata1[subidx], ydata2[subidx], ydata3[subidx])
pylab.xlim(xmin, xmax)

但是这样说起来至少很麻烦(在我看来)。有没有更快的方法可以在不手动计算绘图范围的情况下完成?谢谢!更新2:函数autoscale执行一些缩放操作,似乎是这项工作的合适候选者,但它独立处理轴,并且仅按照完整数据范围缩放,无论轴限制如何。

1
我仍然无法相信Matplotlib不能做到这一点。 - Neilski
根据这两个问题,matplotlib永远不会自动完成,唯一的方法是手动设置:https://github.com/matplotlib/matplotlib/issues/13648,https://github.com/matplotlib/matplotlib/issues/9890 - My Work
1个回答

2
在你所说的数据检查方面,是什么让人感到困难呢?如果是在编写代码方面,那并不算太糟糕。可以尝试类似以下的代码:
pylab.ylim(numpy.min(data), numpy.max(data))

...其中data可以是numpy.arange(100)[0:11]

在一般情况下,如果你有xdataydata(但假设它们已排序),你需要执行以下操作:

from bisect import bisect
sub_ydata = ydata[bisect(xdata, xmin):bisect(xdata, xmax)]
pylab.ylim(numpy.min(sub_ydata), numpy.max(sub_ydata))

如果您的意思是计算上是一件困难的事情,那么我真的不知道matplotlib如何在没有这样的计算的情况下执行它。

1
我并不是说这很难计算,我只是想知道/怀疑 matplotlib 是否可以自动更新轴。显然,如果您绘制数据的全部范围,matplotlib 可以正确获取轴范围,但是当您更新其中一个轴范围时,它并不像逻辑那样运作,我个人认为。此外,在一般情况下,当您有 xdata 和 ydata 时,手动设置变得更加麻烦。 - Tim
逻辑是一旦手动调整了限制,自动缩放就会停止。这很有道理;考虑一下如果出于某种原因你不想让matplotlib自动调整但它仍然这样做,那将会多么烦人。一般情况也不会更糟,让我补充一个简短的例子来说明我的意思。 - Lev Levitsky
我同意自动缩放可能会干扰手动缩放,但我认为这在这种情况下不是问题。特别是如果我在绘图之前设置x范围,我希望matplotlib相应地更改y范围。例如,Gnuplot就是这样做的。无论如何,我假设对我的问题的答案是“否”,谢谢 :) - Tim
啊,我找到了,autoscale 看起来可以满足我的需求! - Tim
1
不要等待,autoscale() 忽略任何轴限制,只查看提供给 plot() 的数据。这本来是解决此问题的好方法,但遗憾的是它并没有。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接