在设置x轴限制后,Matplotlib y轴限制不更新?

时间:2012-04-10 14:12:59

标签: plot matplotlib python-2.7

我正在尝试绘制某些数据的子集,但在设置x轴限制后,y轴限制未正确更新。有没有办法让matplotlib在设置x轴限制后更新y轴限制?

例如,请考虑以下情节:

import numpy
import pylab
pylab.plot(numpy.arange(100)**2.0)

给出:Plot 1 full range

工作正常。但是,如果我只想查看从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)

但至少可以说这很麻烦(imho)。如果没有手动计算绘图范围,有没有更快的方法呢?谢谢!

更新2:

函数autoscale进行了一些缩放,似乎是这项工作的合适人选,但是无论轴的限制是什么,都可以独立处理轴,缩放到整个数据范围

1 个答案:

答案 0 :(得分:1)

在什么意义上你的意思是检查数据很麻烦?如果在编写代码方面,那就不是那么糟糕了。尝试像

这样的东西
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如何在没有这些计算的情况下执行它。