我试图构建一个散点图,但在动画上被难住了。最终,我希望有>1000个点,以(0,0)附近的随机正态分布绘制。然后,每个点都应该以不同的速度围绕(0,0)顺时针或逆时针旋转。
我试图用一个循环函数来做这件事,这个循环函数可以随机化移动,但它非常慢,而且到目前为止,我还无法进行超过一个点的移动:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 4,3
from matplotlib.animation import FuncAnimation
from math import sqrt, exp
from matplotlib.animation import FuncAnimation, PillowWriter
fig, ax = plt.subplots()
# set the axes limits
ax.axis([-2.5,2.5,-2.5,2.5])
# set equal aspect such that the circle is not shown as ellipse
ax.set_aspect("equal")
# create a point in the axes
for i in range(0,6):
x = np.random.normal()
y = np.random.normal()
r = np.sqrt(x*x+y*y)
def circle(phi):
return np.array([r*np.cos(phi), r*np.sin(phi)])
point, = ax.plot(x,y, marker="o")
ani = FuncAnimation(fig, update, interval=10, blit=True, repeat=True,
frames=np.linspace(0,2*np.pi,360, endpoint=False))
plt.show()
writer = PillowWriter(fps=25)
ani.save(r'[path --> .gif]', writer=writer)我如何修复这段代码?
发布于 2020-08-13 14:17:12
这是你想要的吗?
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 4,3
from matplotlib.animation import FuncAnimation
from math import sqrt, exp
fig, ax = plt.subplots()
# set the axes limits
ax.axis([-2.5,2.5,-2.5,2.5])
# set equal aspect such that the circle is not shown as ellipse
ax.set_aspect("equal")
# create a point in the axes
def update(i):
x = np.random.normal()
y = np.random.normal()
r = np.sqrt(x*x+y*y)
def circle(phi):
return np.array([r*np.cos(phi), r*np.sin(phi)])
ax.plot(x,y, marker="o")
ani = FuncAnimation(fig, func=update, interval=10, blit=False, repeat=True,
frames=np.linspace(0,2*np.pi,360, endpoint=False))
plt.show()发布于 2020-08-13 23:43:11
我不太清楚如何更新您的代码以获得解决方案。但我想出了这个,它使用了一些相同的逻辑:
import matplotlib as mpl
from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt
import numpy as np
# how many points to draw
points = 100
# generating x & y coordinates, their distance from origin,
# their angle relative to the origin, and random rotations to
# apply to each point each frame
xs = np.random.uniform(-1, 1, points)
ys = np.random.uniform(-1, 1, points)
ls = np.sqrt(xs**2 + ys**2)
angles = np.arctan2(ys, xs)
negs = np.random.choice([-1, 1], size=points)
rotations = (np.random.uniform(np.pi/50, np.pi/6, size=points) * negs)
# initialize a figure, make a color range to color each point
fig, ax = plt.subplots(figsize=(4,4))
ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)
color_divisions = [(1/points)*i for i in range(points)]
cmap = mpl.cm.get_cmap('jet')
colors = cmap(color_divisions)
# update function
# update gets fed elements from the frames parameter of FuncAnimation
# each update we clear the graph (but reapply the same x/y limits)
# we then draw the points as a scatter and update the data for the next frame
# add each rotation to each angle, and then calculate the new x and y coordinates
# with numpy these calculations can be done w/o a loop, but global is needed
# to update variables from the global scope
def update(f):
global xs, ys, angles, rotations
ax.clear()
ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)
ax.scatter(xs, ys, color=colors)
angles += rotations
ys = np.sin(angles) * ls
xs = np.cos(angles) * ls
#call the animation and save
ani = FuncAnimation(fig, update, interval=200, frames=range(100))
ani.save('ani.gif', writer='pillow')生成以下100个点以随机速度绕原点旋转的动画:

您可以增加点数(对于1000个点,这可能会变得非常慢),调整FPS (interval),或旋转每个点的量。
https://stackoverflow.com/questions/63384819
复制相似问题