如何更新散点图动画

Sam*_*uel 1 python matplotlib scatter-plot matplotlib-animation

我尝试编写一个简单的脚本,它更新每个时间步的散点图t。我想做得尽可能简单。但它所做的只是打开一扇我什么也看不见的窗户。窗户就结冰了。这可能只是一个小错误,但我找不到它。

data.dat格式为

                x      y
Timestep 1      1      2
                3      1
Timestep 2      6      3
                2      1
Run Code Online (Sandbox Code Playgroud)

(该文件仅包含数字)

import numpy as np
import matplotlib.pyplot as plt
import time

# Load particle positioins
with open('//home//user//data.dat', 'r') as fp:
    particles = []
    for line in fp:
        line = line.split() 
        if line:
            line = [float(i) for i in line]
            particles.append(line)

T = 100
numbParticles = 2

x, y = np.array([]), np.array([])

plt.ion()
plt.figure()
plt.scatter(x,y)
for t in range(T):
    plt.clf()
    for k in range(numbP):
            x = np.append(x, particles[numbParticles*t+k][0])
            y = np.append(y, particles[numbParticles*t+k][1])
    plt.scatter(x,y)
    plt.draw()
    time.sleep(1)
    x, y = np.array([]), np.array([])
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 5

制作动画最简单、最简洁的方法是使用该模块,如Matplotlib 动画教程matplotlib.animation中所示。

由于散点图返回 a matplotlib.collections.PathCollection,因此更新它的方法是调用它的set_offsets方法。您可以向它传递一个形状 (N, 2) 的数组或 N 个 2 元组的列表——每个 2 元组都是一个(x,y)坐标。

例如,

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

T = 100
numbParticles = 2
particles = np.random.random((T,numbParticles)).tolist()
x, y = np.array([]), np.array([])

def init():
    pathcol.set_offsets([[], []])
    return [pathcol]

def update(i, pathcol, particles):
    pathcol.set_offsets(particles[i])
    return [pathcol]

fig = plt.figure()
xs, ys = zip(*particles)
xmin, xmax = min(xs), max(xs)
ymin, ymax = min(ys), max(ys)
ax = plt.axes(xlim=(xmin, xmax), ylim=(ymin, ymax))
pathcol = plt.scatter([], [], s=100)

anim = FuncAnimation(fig, update, init_func=init, fargs=(pathcol, particles),
                     interval=1000, frames=T, blit=True, repeat=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)

循环在内部FuncAnimation(),所以你看不到它。如果你愿意的话,你可以查看源代码(实际上那里没有循环,而是一个迭代器),但你也可以接受从外部看到的,每 1000 毫秒FuncAnimation(fig, update, interval=1000, frames=100)调用一次该函数,并增加1 直到数字由 给出。updateiframes