更新python动画时删除先前的散点图

时间:2017-03-28 16:20:26

标签: python animation matplotlib scatter-plot

尽管浏览stackoverflow的时间确实改善了我的python动画代码,但我无法弄清楚一件事,因此我转向社区的善良灵魂,希望有人能够粉碎一些光。 / p>

简而言之,我有一个大约2000 x 1000像素的背景图像让我们说,我需要在这个图像上分散一些点并动画整个过程并将整个事物保存为视频。我只能根据需要更新散点图,除非我无法删除先前的散点图。所以输出不是我真正想要的。如果有人能够看一眼代码并看到毛刺在哪里,我会很高兴。我使用了scat.remove()似乎什么也没做。

先谢谢大家。

import matplotlib.pyplot as plt
import pylab as pl
import numpy as np
from pylab import savefig
from matplotlib import animation
import matplotlib



######################################################
fig = plt.figure()
ax = plt.axes()
a = plt.imread('background.jpg')    
im = plt.imshow(a)

#######################################################

def randpair(n):
    x,y=[],[]
    for i in xrange(n):
        x.append(np.random.randint(100,1900))
        y.append(np.random.randint(100,900))
    return x,y


def animate(i):

    scat = ax.scatter(0,0,color='white')
    points = np.random.randint(5,size=10)

    for j in points: 
        xy = randpair(j)
        x = xy[0]
        y = xy[1]
        print x,y

        if len(x) > 0 :
            scat.remove()
            scat = ax.scatter(x,y,color='r',s=18)


        plt.xticks([])
        plt.yticks([])



    return scat,ax,  # ax returns the text to be updated and scat returns the scatterplot.


anim = animation.FuncAnimation(fig, animate, 49,interval=300, blit=True)
writer = animation.writers['ffmpeg']
anim.save('film_3.mp4')
#plt.show()

1 个答案:

答案 0 :(得分:0)

在代码中,您已经在循环结束之前删除了最后一个分散符;所以会添加一些散点图然后立即删除 可以通过收集列表中的散点,然后使用remove从画布中删除列表中的散点并清除列表来防止这种情况发生。

除此之外,返回完整的ax对象有点无用。所以我建议简单地关闭blitting,因为保存动画无关紧要。

这是一个适合我的完整代码:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation

fig = plt.figure()
ax = plt.axes()
scats = []
a = np.random.rand(8,18)
im = ax.imshow(a, cmap="YlGn", vmin=0, vmax=3, extent=[0,2000,0,1000])
plt.xticks([])
plt.yticks([])

def randpair(n):
    x,y=[],[]
    for i in xrange(n):
        x.append(np.random.randint(100,1900))
        y.append(np.random.randint(100,900))
    return x,y

def animate(i):
    global scats
    # first remove all old scatters
    for scat in scats:
        scat.remove()
    scats=[]
    # now draw new scatters
    points = np.random.randint(5,size=10)
    for j in points: 
        x, y = randpair(j)
        if len(x) > 0 :
            scats.append(ax.scatter(x,y,color='r',s=18))  

anim = matplotlib.animation.FuncAnimation(fig, animate, 50,
                                interval=1000, blit=False)

writer = matplotlib.animation.FFMpegWriter(fps=15, 
            codec="h264", 
            extra_args=["-preset", "veryslow","-crf","0"])
anim.save(__file__+".mp4", writer=writer)

plt.show()

enter image description here