gpt4 book ai didi

python - 从数组编写动画散点图

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:09 25 4
gpt4 key购买 nike

我正在尝试对 Vicsek 模型进行编码,并创建了包含特定时间每个点的 x 和 y 坐标的数组。然后,我调用每个时间间隔的 x 和 y 值并将它们放入列表中。数据采用两个列表的形式,一个用于 x,另一个用于 y。我正在尝试按如下方式对其进行动画处理:

fig = plt.figure()
ax = fig.add_subplot(111)
scat = plt.scatter(x, y, c = x)
scat.set_alpha(0.8)

ax.set_xlim(-L/2, L/2)
ax.set_ylim(-L/2, L/2)

def animate_frames(i, fig, scat):
a = P[i]
xi = []
yi = []
for v in range(N):
xi.append(a[v,0])
yi.append(a[v,1])
A = np.transpose([xi,yi])
scat.set_offsets((A))
return scat

animation = FuncAnimation(fig, func=animate_frames, fargs=(fig,scat), frames= tmax, interval = 1000)
plt.show()

其中 P[i] 调用我在每个时间间隔 i 存储点的 x 和 y 值的数组。 (P 中有 tmax 条目)

我得到的是一个散点图,然后每隔一段时间就会闪烁到另一个散点图,但不是动画。

我是 Python 初学者,如果能得到任何帮助,我将不胜感激。

最佳答案

您尝试为散点图设置动画的方式似乎没有任何问题(除了一些小问题,例如传递不需要传递的变量)。我怀疑您的速度参数或噪声参数太大(在计算更新的点位置时),使得图之间似乎没有连续性。

下面是一个引用实现。如果您使用噪声参数 eta,您会发现更新看起来不连续。

enter image description here

#!/usr/bin/env python
"""
Simple scatter plot animation.
"""
import numpy as np
import matplotlib.pyplot as plt

from matplotlib.animation import FuncAnimation
from scipy.spatial import cKDTree


# def update_positions(x, y, v=0.01):
# # random diffusion
# dx, dy = np.random.randn(2, 100)
# x += v*dx
# y += v*dy
# return x, y


def get_mean_angle(angles):
# https://stackoverflow.com/a/491769/2912349
# convert to unit vectors
x = np.cos(angles)
y = np.sin(angles)
X = np.c_[x, y]
U = X / np.linalg.norm(X)
# get mean unit vector
x, y = np.mean(X, axis=0)
return np.arctan2(y, x)


def update_positions(x, y, theta, eta=0.1, r=0.1, v=0.01):
# https://en.wikipedia.org/wiki/Vicsek_model
X = np.c_[x,y]
tree = cKDTree(X)
neighbours = tree.query_ball_tree(tree, r=r)
for ii, nn in enumerate(neighbours):
theta[ii] = get_mean_angle(theta[nn]) + 2*np.pi*np.random.rand()*eta

X += v * np.c_[np.cos(theta), np.sin(theta)]
x, y = X.T
return x, y, theta


if __name__ == '__main__':

total_points = 100
x, y = np.random.rand(2, total_points)
theta = 2*np.pi*np.random.rand(total_points)

fig, ax = plt.subplots(1,1)
scatter = ax.scatter(x, y)

def animate_frames(ii, x, y, theta):
x, y, theta = update_positions(x, y, theta)
scatter.set_offsets(np.c_[x, y])
return scatter

animation = FuncAnimation(fig, fargs=(x,y,theta), func=animate_frames, frames=20)
animation.save('vicsek.gif', writer='imagemagick', savefig_kwargs={'facecolor':'white'}, fps=5)
plt.show()

关于python - 从数组编写动画散点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60363451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com