使用MatPlotLib绘制连续的数据流

时间:2017-02-03 12:53:41

标签: 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)

然而,这里发生的是创建了多个窗口,因此在循环结束时我有100个窗口。此外,我注意到,对于最近的窗口,它只是一个白色窗口,该图只出现在下一步。

所以,我的两个问题是:

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

(1)

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

import matplotlib.pyplot as plt

plt.ion()
for i in range(100):
    x = range(i)
    y = range(i)
    # plt.gca().cla() # optionally clear axes
    plt.plot(x, y)
    plt.title(str(i))
    plt.draw()
    plt.pause(0.1)

plt.show(block=True) # block=True lets the window stay open at the end of the animation.

除了这个非常简单的方法之外,请使用http://matplotlib.org/examples/animation/index.html

中提供的任何动画示例

(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=0range(i) == []是一个没有任何点的空列表。即使对于i=1,也只绘制了一个点,但当然没有线可以将单个点连接到自身。

答案 1 :(得分:0)

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

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)