8

我正在尝试绘制一些数据的子集,但是在设置 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)

这给出了:绘图 1 子集

在前一种情况下,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做了一些缩放,似乎是这项工作的合适人选,但独立处理轴并且缩放到完整数据范围,无论轴限制是多少。

4

1 回答 1

2

从什么意义上说,检查数据很麻烦?如果就编写代码而言,那还不错。尝试类似的东西

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如果没有这样的计算怎么能执行它。

于 2012-04-10T22:18:55.807 回答