我正在尝试绘制某些数据的子集,但在设置x轴限制后,y轴限制未正确更新。有没有办法让matplotlib在设置x轴限制后更新y轴限制?
例如,请考虑以下情节:
import numpy
import pylab
pylab.plot(numpy.arange(100)**2.0)
给出:
工作正常。但是,如果我只想查看从x = 0到x = 10的部分,那么y缩放就会搞砸:
pylab.plot(numpy.arange(100)**2.0)
pylab.xlim(0,10)
给出:。
在前一种情况下,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进行了一些缩放,似乎是这项工作的合适人选,但是无论轴的限制是什么,都可以独立处理轴,仅缩放到整个数据范围
答案 0 :(得分:1)
在什么意义上你的意思是检查数据很麻烦?如果在编写代码方面,那就不是那么糟糕了。尝试像
这样的东西pylab.ylim(numpy.min(data), numpy.max(data))
...其中data
可以是numpy.arange(100)[0:11]
。
在一般情况下,如果您有xdata
和ydata
(但假设它们已经排序),您将不得不这样做
from bisect import bisect
sub_ydata = ydata[bisect(xdata, xmin):bisect(xdata, xmax)]
pylab.ylim(numpy.min(sub_ydata), numpy.max(sub_ydata))
如果你的意思是计算上很难,那么我没有真正看到matplotlib
如何在没有这些计算的情况下执行它。