Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除matplotlib basemap动画中字典中存储的点_Python_Animation_Matplotlib_Plot_Matplotlib Basemap - Fatal编程技术网

Python 删除matplotlib basemap动画中字典中存储的点

Python 删除matplotlib basemap动画中字典中存储的点,python,animation,matplotlib,plot,matplotlib-basemap,Python,Animation,Matplotlib,Plot,Matplotlib Basemap,我正在尝试做以下工作:绘制点并将引用存储在字典中。设置动画时删除点。最简单的示例如下所示: %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_

我正在尝试做以下工作:绘制点并将引用存储在字典中。设置动画时删除点。最简单的示例如下所示:

%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()
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()
输出:

Init
Init
Frame 0
Frame 1
Frame 2
Removing first
Frame 3
有趣的是,如果我只绘制第一个点(即,删除pointDict[2]=m.plot和pointDict[2]。在init函数中设置_数据),这是可行的。但如果两者都已绘制,则删除第一点和第二点都不起作用

相关问题将我带到了现在:


我正在将Anaconda与Python-2.7内核一起使用。

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

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