使用MatPlotLib绘制连续数据流

cyej8jka  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(146)

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

s6fujrry

s6fujrry1#

(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中提供的任何动画示例

(二)

为了在新窗口中获取每个图,使用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,也只有一个点被绘制出来,但是当然没有任何线可以连接一个点。

xdyibdwo

xdyibdwo2#

我认为最好的方法是创建一个线图,然后更新其中的数据。这样你就有了一个窗口和一个图表,它会不断更新。

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)
hsvhsicv

hsvhsicv3#

这里有一个方法,我发现工作真的很好。
你需要这个包裹

from IPython.display import clear_output

%matplotlib inline
import matplotlib.pyplot as plt

clear_output清除notebook的输出。

def plot_graph(list_of_points: list):
    clear_output(wait=True)
    plt.figure(figsize=(15, 10), linewidth=2, edgecolor='steelblue', facecolor='skyblue')
    plt.subplots_adjust(left=0.20, bottom=0.20)
    ax = plt.gca()
    ax.set_xlim([0, max_x])
    plt.plot(list_of_points, label="Points")
    plt.legend()
    plt.show()

这将获取一个点列表,清除单元格的输出并绘制一个新的图形。
你可以把它放在一个for循环中,看起来像这样:

points = []
for i in range(10):
    points.append(i + random.randint(0, 9))
    plot_graph(points, 10)

应该是这样的。

我并不是说这就是方法,但它足够简单,我可以理解和编辑,并为我完成工作。

编辑我添加了plt.legend()来显示图的名称,它没有显示在gif中,因为那是在我创建gif之后。

相关问题