自动调整 ylim 和 xlim 的比例尺

59
我正在使用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按照第一次绘图时的比例来缩放限制?


2
请查看以下两个相关答案:https://dev59.com/cE7Sa4cB1Zd3GeqP8Pdx#3215060 和 https://dev59.com/dGw05IYBdhLWcg3whCNn#7198623 - Chris
1个回答

79

您需要更新坐标轴的数据极限(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()

33
请注意,如果您之前在同一轴上使用了set_xlim(),则autoscale_view()将无法起作用。在这种情况下,应改用autoscale()(在1.5.x版本中测试通过)。 - kawing-chiu
2
似乎relim()autoscale*()只考虑标记的位置并忽略误差线。必须有一种方法来计算限制,以考虑误差线(或者一般来说,绘图中的所有绘制元素),因为默认情况下它们被正确地绘制。如果使用ylim(或set_ylim)缩放绘图,则我找不到返回原始视图的方法。 - S.V
这个很好用!我有一个问题想问。如果使用ax.errorbar(x, y, error),这种方法不会考虑误差线,因此误差线可能会被隐藏在轴之后。有没有办法解决这个问题?谢谢! - zyy
2
@zyy 这不是一个答案,只是一条注释:我认为这是因为errorbar使用了Collections,而这些被ax.relim()忽略了:请参阅文档 - normanius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接