2012-04-10 107 views
3

我想绘制一些数据的子集,但是在设置x轴限制后,y轴限制没有正确更新。有没有办法让matplotlib在设置x轴限制后更新y轴限制?设置x轴限制后,Matplotlib的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

从某种意义上说,检查数据是否很麻烦?如果从编写代码的角度来看,那并不是那么糟糕。尝试类似

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如何执行它。

+0

我并不是说它在计算上很难,我只是想知道matplotlib能够自己更新轴。很显然,如果绘制数据的全部范围,matplotlib会正确地获取轴范围,但当您更新其中一个轴范围imho时,它不会如此逻辑。另外在一般情况下,当你有xdata和ydata时,手动设置变得更麻烦。 – Tim 2012-04-11 07:36:44

+0

逻辑是,一旦手动调整限制,自动缩放会停止。这说得通;考虑一下,如果由于某种原因,你会觉得有多恼人**而不是**希望matplotlib自动调整,但它会。一般情况并没有太大的变化,我想补充一下我的意思。 – 2012-04-11 07:47:06

+0

我同意自动缩放可能会干扰手动缩放,但恕我直言,这不是这里的情况。特别是如果我在绘制之前设置了xrange,我会希望matplotlib相应地更改yrange。例如,Gnuplot就是这样做的。在任何情况下,我假设我的问题的答案是'不',所以谢谢:) – Tim 2012-04-11 08:08:45