移除存储在 matplotlib 底图动画中的字典中的点



我正在尝试执行以下操作:绘制点并将引用存储在字典中。在动画删除点时。一个最小的示例如下所示:

%matplotlib qt
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.animation as animation
fig = plt.figure()  
m = Basemap(projection='aeqd',lat_0=72,lon_0=29, resolution='l',   
        llcrnrlon=15, llcrnrlat=69,
        urcrnrlon=41, urcrnrlat=75.6,area_thresh = 100)
pointDict=dict()
pointDict[1]=m.plot (0, 0,marker='.',label='first')[0]
pointDict[2]=m.plot (0, 0,marker='.',label='second')[0]
def init():
    print ("Init")
    x,y = m(30, 73)
    pointDict[1].set_data(x,y)
    x,y = m(31, 73)
    pointDict[2].set_data(x,y)
    return pointDict.values()
def animate(i):
    print ("Frame {0}".format(i))
    if i==2:
        l=pointDict.pop(1)
        print ("Removing {0}".format(l.get_label()))
        l.remove()
        del l
    return pointDict.values()
anim = animation.FuncAnimation(plt.gcf(), animate, init_func=init,
                           frames=10, interval=1000, blit=True)
plt.show()

输出:

Init
Init
Frame 0
Frame 1
Frame 2
Removing first
Frame 3

有趣的是,如果我只绘制第一个点(即在 init 函数中删除 pointDict[2]=m.plot 和 pointDict[2].set_data),这就可以了。但是,如果两者都被绘制出来,那么删除第一个点和第二个点都不起作用。

相关问题让我走到了现在的地步:

Matplotlib 底图动画

如何删除 Matplotlib 图中的线条

Matplotlib 为多行和多文本制作动画

Python,Matplotlib,绘图多行(数组)和动画

我正在使用Anaconda和Python-2.7内核。

我发现了问题所在,因此想自己回答我的问题:这个问题有点出乎意料,blit=True。显然,只有在 animate 函数中设置了点时,才能使用块传输。因此,在 init 例程中设置数据会导致问题。所以有两个选择:将 blit 设置为 False,但这不是很优雅。另一种选择是在第一帧中设置点。然后,工作的初始化和动画函数如下所示:

def init():
    print ("Init")
    pointDict[1].set_data([],[])
    pointDict[2].set_data([],[])
    return pointDict.values()
def animate(i):
    print ("Frame {0}".format(i))
    if i==0:
        print ("Init")
        x,y = m(30, 73)
        pointDict[1].set_data(x,y)
        x,y = m(31, 73)
        pointDict[2].set_data(x,y)
    if i==2:
        l=pointDict.pop(1)
        print ("Removing {0}".format(l.get_label()))
        l.remove()
        del l
    return pointDict.values()
anim = animation.FuncAnimation(plt.gcf(), animate, init_func=init,
                       frames=10, interval=1000, blit=True)
plt.show()

相关内容

  • 没有找到相关文章

最新更新