Python中与Matlab中的'hold on'相对应的是什么?

81

Python的matplotlib中是否有与Matlab的hold on等效的明确命令?我正在尝试在同一坐标轴上绘制所有图形。一些图形是在for循环内生成的,这些图形与susl分别绘制。

import numpy as np
import matplotlib.pyplot as plt

for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)
    plt.axis([0,50,60,80])

plt.show()

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.axis([0,50,60,80])
plt.show()

7
你的意思是 plt.hold(True) 吗? - Cody Piersall
可能是multiple-plot-in-one-figure-in-python的重复问题。 - Kraay89
@Cody Piersall - 这个方法可能适用于其他情况,但是显然不适用于我的例子。 - Medulla Oblongata
2
应该指出,hold=True是默认值。 - tacaswell
希望这可以帮到你,因为这对我有用:链接 - troymyname00
在最新版本的matplotlib中,plt.hold(True)已经被弃用。请在程序中使用plt.show()。 - user2110417
5个回答

62

在最后只需调用 plt.show() 即可:

import numpy as np
import matplotlib.pyplot as plt

plt.axis([0,50,60,80])
for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)    

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.show()

8
注意:如果涉及到从命令行进行交互输入,则此方法不起作用。但在脚本中执行则可以正常运行。 - ZZZ

24

您可以使用以下内容:

plt.hold(True)

20
这个函数已经被弃用了,有没有类似的替代方案? - Jyotirmay
3
@Jyotirmay 在Matplotlib中的hold函数没有任何作用,因此已被弃用。无论如何,pyplot始终会像设置了“hold”为True一样运行。 - ImportanceOfBeingErnest

19

matplotlib.pyplot中,默认情况下启用了hold on功能。因此,在调用plt.show()之前每次调用plt.plot(),就会向绘图中添加一张图片。如果在函数plt.show()之后再调用plt.plot(),则会重新绘制整个图形。


1
当使用IPython时,你该如何解决这个问题? - ThatNewGuy
1
使用后端%matplotlib inline,所有plt.plot()在一个单元格中将输出到同一帧中。如果您在单元格中的plt.plot()函数之间放置plt.show(),它将创建更多的框架,每个plt.show()都会创建一个新的框架。 - freude

0

查看 pyplot 文档。为了完整性,

import numpy as np
import matplotlib.pyplot as plt

#evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)

# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()

0
使用plt.sca(ax)来设置当前的坐标轴,其中ax是您想要激活的Axes对象。
例如:
在第一个函数中: import numpy as np import matplotlib.pyplot as plt
for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)
    plt.axis([0,50,60,80])

plt.show()

在下一个函数中: def function2(...., ax=None)
if ax is None:
    fig, ax = plt.subplots(1)
else:
    plt.sca(ax)

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.axis([0,50,60,80])
plt.show()

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