【问题标题】:Automatically Rescale ylim and xlim in Matplotlib在 Matplotlib 中自动重新缩放 ylim 和 xlim
【发布时间】:2012-06-14 14:14:01
【问题描述】:

我正在使用 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()

第一个绘图命令从[0,1] 生成一个绘图,我可以看到一切正常。最后,y 数据数组从[0,10) 开始,其中大部分大于1,但该图的 y 限制仍为[0,1]

我知道我可以使用pyplot.ylim(...) 手动更改限制,但我不知道将它们更改为什么。在for 循环中,我可以告诉 pyplot 像第一次绘制一样缩放限制吗?

【问题讨论】:

标签: python matplotlib


【解决方案1】:

您需要更新坐标区的 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()

【讨论】:

  • 请注意,如果您之前在相同的轴上使用过set_xlim()autoscale_view() 将不起作用。在这种情况下,应该使用autoscale() 代替(在 1.5.x 上测试)。
  • 看来,relim()autoscale*() 只考虑了标记的位置而忽略了误差线。必须有一种方法来计算考虑到误差线(或者,一般来说,绘图上的所有绘制元素)的限制,因为默认情况下它们是正确绘制的。如果有人使用ylim(或set_ylim)“缩放”绘图,那么我无法找到“取消缩放”回到原始视图的方法。
  • 这很好用!我想问一件事。如果与ax.errorbar(x, y, error) 一起使用,此方法不会考虑误差线,因此误差线可能会隐藏在轴之后。有没有办法解决这个问题?谢谢!
  • @zyy 不是答案,只是说明:我认为原因是错误栏使用了集合,这些集合被 ax.relim() 忽略:请参阅docu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多