在Matplotlib中自动重新缩放ylim和xlim

jlc*_*lin 31 python matplotlib

我正在使用matplotlib在Python中绘制数据.我正在根据一些计算更新绘图的数据,并希望ylim和xlim自动重新缩放.相反,发生的是基于初始图的限制来设置比例.MWE是

import random
import matplotlib.pyplot as pyplot

pyplot.ion()

x = range(10)
y = lambda m: [m*random.random() for i in range(10)]

pLine, = pyplot.plot(x, y(1))

for i in range(10):
    pLine.set_ydata(y(i+1))
    pyplot.draw()
Run Code Online (Sandbox Code Playgroud)

第一个绘图命令生成一个图[0,1],我可以看到一切都很好.最后,y数据阵列的[0,10)大部分都大于1,但数字的y限制仍然存在[0,1].

我知道我可以手动更改限制pyplot.ylim(...),但我不知道要改变它们的内容.在for循环中,我可以告诉pyplot缩放限制,就好像它是第一次被绘制一样吗?

pel*_*son 46

您需要更新轴的dataLim,然后根据dataLim更新轴的viewLim.适用的方法axes.relim()ax.autoscale_view()方法.您的示例如下所示:

import random
import matplotlib.pyplot as pyplot

pyplot.ion()

x = range(10)
y = lambda m: [m*random.random() for i in range(10)]

pLine, = pyplot.plot(x, y(1))

for i in range(10):
    pLine.set_ydata(y(i+1))

ax = pyplot.gca()

# recompute the ax.dataLim
ax.relim()
# update ax.viewLim using the new dataLim
ax.autoscale_view()
pyplot.draw()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您之前在相同的轴上使用过`set_xlim()`,`autoscale_view()`将不起作用.在这种情况下,应该使用`autoscale()`(在1.5.x上测试). (14认同)
  • 看来,“relim()”和“autoscale*()”只考虑标记的位置并忽略误差线。必须有一种方法来计算限制,同时考虑误差线(或者一般来说,绘图上的所有绘制元素),因为默认情况下它们是正确绘制的。如果使用“ylim”(或“set_ylim”)“缩放”绘图,那么我无法找到一种方法“取消缩放”回到原始视图。 (2认同)
  • @zyy不是一个答案,只是一个注释:我认为这样做的原因是错误栏使用集合,它被 ax.relim() 忽略:请参阅[docu](https://matplotlib.org/3.1.1 /api/_as_gen/matplotlib.axes.Axes.relim.html#matplotlib.axes.Axes.relim)。 (2认同)