在使用Python';s matplotlib

在使用Python';s matplotlib,python,animation,matplotlib,scatter,Python,Animation,Matplotlib,Scatter,我正在尝试在图形上设置一条线和3个分散点的动画。一切似乎都在运行,除了第一组分散点没有在图形上删除 这是代码,您可以尝试将n设置为1、2或3 import numpy as np from math import * from pylab import * from matplotlib import pyplot as plt from matplotlib import animation # Constants isqrt = 2**(-0.5) omega = np.sqrt(2-np

我正在尝试在图形上设置一条线和3个分散点的动画。一切似乎都在运行,除了第一组分散点没有在图形上删除

这是代码,您可以尝试将n设置为1、2或3

import numpy as np
from math import *
from pylab import *
from matplotlib import pyplot as plt
from matplotlib import animation

# Constants
isqrt = 2**(-0.5)
omega = np.sqrt(2-np.sqrt(2))   #Angular velocity
L=4                             #Length of the system

n = 1                         #Normal mode number  
if n==1:
    z = [isqrt,1,isqrt]             #mode 1
elif n==2:
    z = [1,0,-1]                   #mode 2
elif n==3:
    z = [isqrt,-1,isqrt]           #mode 3

ex = [1,2,3]                    #x-coordinates of scatter points

# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()
ax = plt.axes(xlim=(0, L), ylim=(-1.1, 1.1))

line, = ax.plot([], [], lw=2)
scat = ax.scatter([],[])
# initialization function: plot the background of each frame
def init():
    line.set_data([], [])
    scat.set_array(None)
    return [scat,line,]

# animation function.  This is called sequentially
def animate(t):
    xinterval = np.arange(0,10,0.05)
    wave = np.cos(0.1*omega*t)*np.sin(n*xinterval*np.pi/L)
    line.set_data(xinterval, wave)
    dots = z*real(np.exp(0+(omega*0.1*t)*1j))

    scat = plt.scatter(ex, dots, s=50)
    return [scat,line,]

# call the animator. 
anim = animation.FuncAnimation(fig, animate,init_func=init, frames=200, interval=20,     blit=True)
plt.grid(True)
plt.show()
除非您有充分的理由使用
散布
(即您希望每个标记具有不同的颜色或大小,而示例代码并未显示),否则上述方法将更有效地生成相同的动画


您的原始代码的问题是,您每次都没有更新
scatter
艺术家,您正在添加一个新的艺术家,该艺术家以奇怪的方式与blitting代码交互(在我的机器上,之前所有的点随机可见或不可见)。

这太完美了,谢谢!我很高兴摆脱了分散,这看起来更干净了。@RobertK如果这解决了你的问题,请接受它(左边的灰色复选标记)
import numpy as np
from math import *
from pylab import *
from matplotlib import pyplot as plt
from matplotlib import animation

# Constants
isqrt = 2**(-0.5)
omega = np.sqrt(2-np.sqrt(2))   #Angular velocity
L=4                             #Length of the system

n = 1                         #Normal mode number  
if n==1:
    z = [isqrt,1,isqrt]             #mode 1
elif n==2:
    z = [1,0,-1]                   #mode 2
elif n==3:
    z = [isqrt,-1,isqrt]           #mode 3

ex = [1,2,3]                    #x-coordinates of scatter points

# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()
ax = plt.axes(xlim=(0, L), ylim=(-1.1, 1.1))

line, = ax.plot([], [], lw=2, color='b')
scat, = ax.plot([],[], linestyle='', marker='o', color='b')
# initialization function: plot the background of each frame
def init():
    line.set_data([], [])
    scat.set_data([], [])
    return [scat,line,]

# animation function.  This is called sequentially
def animate(t):
    xinterval = np.arange(0,10,0.05)
    wave = np.cos(0.1*omega*t)*np.sin(n*xinterval*np.pi/L)
    line.set_data(xinterval, wave)
    dots = z*real(np.exp(0+(omega*0.1*t)*1j))

    scat.set_data(ex, dots)
    return [scat,line,]

# call the animator. 
anim = animation.FuncAnimation(fig, animate,init_func=init, frames=range(200), interval=20,     blit=True)
plt.grid(True)
plt.show()