Matplotlib动画擦除以前的数据

时间:2019-06-12 14:35:58

标签: python python-3.x matplotlib animation scatter-plot

我正在尝试使用Matplotlib制作一个简单的动画,以检查我的模拟是否运行良好。我想看看两个粒子如何在x-y平面中移动:如果代码起作用,它们应该吸引并在同一点结束或在空间上接近。

我计算“ for”循环中粒子的位置,每次获取位置时,我都使用plt.scatter(x,y)绘制它们的位置,其中x和y是时间t = t + dt。我已经在线阅读了可以在循环内编写plt.pause(0.05)的代码,这将生成我想要的简单动画。

我的代码示例如下:

import numpy as np
import matplotlib.pyplot as plt

for k in range(steps):
    pos = computeNewPos(pos, vel, force)        

    plt.scatter(pos[0, 0], pos[0, 1], label = '1', color = 'r')
    plt.scatter(pos[1, 0], pos[1, 1], label = '2', color = 'b')

    plt.xlabel('X')
    plt.ylabel('Y')

    plt.pause(0.05)

plt.show()

这有效,但是我获得的“动画”包含旧的数据点,我只想查看更新的位置。这样可以更轻松地跟踪粒子的位置。如何在for循环中为每个运行“擦除”旧点?有没有一种方法可以在每次运行时清除框架?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案(也许不是最有效的)是在重绘之前用axis.clear()擦拭轴:

fig, ax = plt.subplots()
for k in range(steps):
    pos = computeNewPos(pos, vel, force)
    ax.clear()        

    ax.scatter(pos[0, 0], pos[0, 1], label = '1', color = 'r')
    ax.scatter(pos[1, 0], pos[1, 1], label = '2', color = 'b')

    ax.xlabel('X')
    ax.ylabel('Y')

    plt.pause(0.05)

plt.show()

请注意,我在一开始就生成图形和轴(因此在打开多个窗口的情况下仍然可以使用)。您还可以使用plt.gca().clear()来清除当前轴,但这是IMO更加脆弱并且容易出错。