如何为多个点设置动画以围绕单个点独立旋转?

问题描述

我正在尝试构建散点图,并陷入动画中。最终,我希望有> 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)

如何解决代码

解决方法

这是您想要的吗?

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()
,

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

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,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,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点动画:

enter image description here

您可以增加点数(这可能会很慢,达到1000点),调整FPS(interval)或旋转每个点的量。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...