Исключение анимации нескольких фигур базовой карты Matplotlib: у объекта list нет атрибута set_animated - PullRequest
1 голос
/ 23 июня 2019

Я использую базовую карту, чтобы нанести несколько полигонов на карту и сделать анимацию. Когда я анимирую один полигон и меняю его форму, он работает. Если я добавлю второй, я получу исключение:

Traceback (most recent call last):
  File "...\Programs\Python\Python37\lib\site-packages\matplotlib\cbook\__init__.py", line 216, in process
    func(*args, **kwargs)
  File "...\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 953, in _start
    self._init_draw()
  File "...\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1741, in _init_draw
    a.set_animated(self._blit)
AttributeError: 'list' object has no attribute 'set_animated'
Traceback (most recent call last):
  File "...\Local\Programs\Python\Python37\lib\site-packages\matplotlib\cbook\__init__.py", line 216, in process
    func(*args, **kwargs)
  File "...\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1269, in _handle_resize
    self._init_draw()
  File "..\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1741, in _init_draw
    a.set_animated(self._blit)
AttributeError: 'list' object has no attribute 'set_animated'

Мой код:

input = pd.read_csv(filename)
data = pd.read_csv(datafilename)


m = Basemap(projection='spstere',boundinglat=-50,lon_0=0,resolution='l', area_thresh = 1000.0)
m.fillcontinents()
m.drawmapboundary()
lon =[]
lat = []
lon1=[]
lat1=[]
for j in range(0,100):
    latlist = list()
    latlist1 = list()
    for i in range(0,361):
        latlist.append(float(input.iloc[j][str(i)]))
        latlist1.append(float(data.iloc[j][str(i)]))
    lat.append(latlist)
    lon.append(list(range(0,361)))
    lat1.append(latlist1)
    lon1.append(list(range(0,361)))
polys = []

x,y = m(lon[0],lat[0])
xy = list(zip(x,y))
poly=Polygon(xy,facecolor='None', alpha=1, edgecolor='green', linewidth=1)

x1,y1 = m(lon1[0],lat1[0])
xy1 = list(zip(x1,y1))
poly1=Polygon(xy1,facecolor='None', alpha=1, edgecolor='red', linewidth=1)

polys.append(poly)
polys.append(poly1)
def init():
    plt.gca().add_patch(polys[0])
    plt.gca().add_patch(polys[1])
    return polys,

def animate(i):
    print(i)
    x,y = m(lon[i], lat[i])
    xy=list(zip(x,y))
    polys[0].set_xy(xy)

    x1,y1 = m(lon1[i], lat1[i])
    xy1=list(zip(x1,y1))
    polys[1].set_xy(xy1)
    return polys,

anim = animation.FuncAnimation(plt.gcf(), animate, init_func=init, frames=100, interval=500, blit=True)

plt.show()

Если я возвращаю только один поли в функциях и устанавливаю blit = False, это работает. Если я возвращаю только один poly в функциях и blit = True - меняется только один многоугольник. Как анимировать две фигуры в одной анимации с блиттингом?

1 Ответ

0 голосов
/ 23 июня 2019

Вам необходимо вернуть итерацию артистов , которую вы хотите обновить. Обычно это кортеж или список.

polys это список художников
poly, poly1 это кортеж художников
[poly, poly1] это список художников
(poly, poly1) это кортеж художников
и т.д.

Но polys, - это кортеж из одного списка. Этот список не является художником, о чем говорит вам ошибка.

...