首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置多个点的动画,使其独立地围绕单个点旋转?

如何设置多个点的动画,使其独立地围绕单个点旋转?
EN

Stack Overflow用户
提问于 2020-08-13 05:16:14
回答 2查看 52关注 0票数 0

我试图构建一个散点图,但在动画上被难住了。最终,我希望有>1000个点,以(0,0)附近的随机正态分布绘制。然后,每个点都应该以不同的速度围绕(0,0)顺时针或逆时针旋转。

我试图用一个循环函数来做这件事,这个循环函数可以随机化移动,但它非常慢,而且到目前为止,我还无法进行超过一个点的移动:

代码语言:javascript
复制
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)

我如何修复这段代码?

EN

回答 2

Stack Overflow用户

发布于 2020-08-13 14:17:12

这是你想要的吗?

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2020-08-13 23:43:11

我不太清楚如何更新您的代码以获得解决方案。但我想出了这个,它使用了一些相同的逻辑:

代码语言:javascript
复制
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),或旋转每个点的量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63384819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档