Python 使用MatPlotLib打印连续数据流

Python 使用MatPlotLib打印连续数据流,python,matplotlib,Python,Matplotlib,我想使用MatPlotLib绘制一个图形,其中的图形会随时间而变化。在每个时间步,将向绘图中添加一个附加数据点。但是,应该只显示一个图形,其外观随时间而变化 在我的测试示例中,该图是一个简单的线性图(y=x)。以下是我尝试过的: for i in range(100): x = range(i) y = range(i) plt.plot(x, y) plt.ion() plt.show() time.sleep(1) 然而,这里发生的事情是创建

我想使用MatPlotLib绘制一个图形,其中的图形会随时间而变化。在每个时间步,将向绘图中添加一个附加数据点。但是,应该只显示一个图形,其外观随时间而变化

在我的测试示例中,该图是一个简单的线性图(y=x)。以下是我尝试过的:

for i in range(100):
    x = range(i)
    y = range(i)
    plt.plot(x, y)
    plt.ion()
    plt.show()
    time.sleep(1)
然而,这里发生的事情是创建了多个窗口,因此在循环结束时,我有100个窗口。另外,我注意到,对于最近的窗口,它只是一个白色窗口,并且绘图仅在下一步显示

因此,我的两个问题是:

1) 如何更改代码,以便只显示一个窗口,其内容随时间变化

2) 如何更改代码,以便在最近的时间步中,绘图实际显示在窗口上,而不是仅显示白色窗口

谢谢

(一) 您可以在开始时设置
plt.ion()
,并将所有图形绘制到同一窗口。在循环中,使用
plt.draw()
显示图形,并使用
plt.pause(t)
进行暂停。请注意,
t
可以非常小,但命令必须在那里,动画才能在大多数后端工作。
在使用
plt.gca().cla()
打印新内容之前,可能需要清除轴

除了这种非常简单的方法之外,还可以使用中提供的动画示例

(2) 要在新窗口中获取每个绘图,请使用
plt.figure()
并删除
plt.ion()
。也仅在末尾显示窗口:

import matplotlib.pyplot as plt

for i in range(100):
    x = range(i)
    y = range(i)
    plt.figure()
    plt.plot(x, y)
    plt.title(str(i))
    
plt.show()

请注意,您可能会发现,在这两种情况下,第一个图都是空的,因为对于
i=0
range(i)=[]
是一个没有任何点的空列表。即使对于
i=1
也只有一个点被绘制,但当然没有一条线可以将一个点与其自身连接起来。

我认为最好的方法是创建一个线图,然后更新其中的数据。然后,您将有一个窗口和一个图形,将不断更新

import matplotlib.pyplot as plt

plt.ion()
fig = plt.figure(figsize=(16,8))
axes = fig.add_subplot(111)
data_plot=plt.plot(0,0)
line, = axes.plot([],[])
for i in range(100):
    x = range(i)
    y = range(i)
    line.set_ydata(y)
    line.set_xdata(x)
    if len(y)>0:
        axes.set_ylim(min(y),max(y)+1) # +1 to avoid singular transformation warning
        axes.set_xlim(min(x),max(x)+1)
    plt.title(str(i))
    plt.draw()
    plt.pause(0.1)

plt.show(block=True)

如果您在
for
循环的
外部调用
plt.figure()
,则它的工作方式与上面所示的
plt.ion()
方法类似,只是您不必在运行脚本的其余部分之前关闭该图(就像我必须使用2.7)。@FeeJF抱歉,我不太明白你在说什么。如果在循环外部调用
plt.figure()
,则只有一个窗口,根本没有动画。
import matplotlib.pyplot as plt

plt.ion()
fig = plt.figure(figsize=(16,8))
axes = fig.add_subplot(111)
data_plot=plt.plot(0,0)
line, = axes.plot([],[])
for i in range(100):
    x = range(i)
    y = range(i)
    line.set_ydata(y)
    line.set_xdata(x)
    if len(y)>0:
        axes.set_ylim(min(y),max(y)+1) # +1 to avoid singular transformation warning
        axes.set_xlim(min(x),max(x)+1)
    plt.title(str(i))
    plt.draw()
    plt.pause(0.1)

plt.show(block=True)