使用 MatPlotLib 绘制连续的数据流

Posted

技术标签:

【中文标题】使用 MatPlotLib 绘制连续的数据流【英文标题】:Plotting a continuous stream of data with MatPlotLib 【发布时间】:2017-06-20 20:36:15 【问题描述】:

我想使用 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) 如何更改我的代码,以便在最近的时间步中,绘图实际上显示在窗口上,而不是只显示一个白色窗口?

谢谢!

【问题讨论】:

Dynamically updating plot in matplotlib的可能重复 【参考方案1】:

(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,也只绘制了一个点,但当然没有一条线可以将单个点与其自身连接起来。

【讨论】:

另外,如果您在for 循环之外调用plt.figure(),那么它将以与上面显示的plt.ion() 方法类似的方式工作,但您不必关闭运行脚本的其余部分之前的图(就像我必须使用 2.7 一样)。 @FeeJF 对不起,我不太明白你在说什么。如果在循环外调用plt.figure(),则只有一个窗口,根本没有动画。【参考方案2】:

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

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)

【讨论】:

以上是关于使用 MatPlotLib 绘制连续的数据流的主要内容,如果未能解决你的问题,请参考以下文章

使用 python-matplotlib 进行连续 3D 绘图(即图形更新)?

如何使用matplotlib创建具有连续轴的图形?

是否可以使用 matplotlib 实现表面图的连续颜色渐变?

Python安装Matplotlib

如何在 matplotlib / Python 中更改后端

Matplotlib散点图条形图直方图-02