Базовая карта Matplotlib Анимация Hexbin: Очистить hexbins между кадрами - PullRequest
0 голосов
/ 24 мая 2018

Я анимирую шестнадцатеричную тепловую карту поверх изображения базовой карты, но не могу понять, как удалить предыдущие гексы перед началом следующего кадра.Я хочу анимировать с некоторым накоплением, но сбрасывать через выбранные интервалы (мои данные имеют временное измерение, я хочу, чтобы показать все точки для данного года, день за днем, затем стереть гексы и показать следующий год).Я думаю, мне нужно сохранить слой и использовать его метод .remove (), но я не могу понять это.

def update_hex(i, prev_layer):
  if i == (len(years) - 1):
    ani.event_source.stop()
    print("End animation: Update Hex")

  x, y = [mm.xmin, mm.xmax], [mm.ymin, mm.ymax]
  x1, y1 = mm(df["LONGITUDE"][df["YEAR"] == years[i]].values, df["LATITUDE"][df["YEAR"] == years[i]].values)
  x += x1.tolist()
  y += y1.tolist()
  x = np.array(x)
  y = np.array(y)
  if prev_layer:
    prev_layer.remove()

  hexlayer = mm.hexbin(x, y, gridsize = 75, bins = 100, mincnt = 0, cmap = 'my_cmap', linewidth = 0)

prev_layer = None
ani = animation.FuncAnimation(fig, update_hex, interval = 10, frames = range(len(years)), fargs = (prev_layer, ))
plt.show()

1 Ответ

0 голосов
/ 24 мая 2018

В этом случае я бы использовал глобальный массив для хранения объектов, возвращаемых hexbin().Через определенные интервалы я удаляю эти объекты и очищаю содержимое массива, а затем повторяю.

fig, ax = plt.subplots()

def animate(i):
    x0,y0 = np.random.random(size=(2,))*4-2
    x = np.random.normal(loc=x0, size=(1000,))
    y = np.random.normal(loc=y0, size=(1000,))

    if len(prevlayers)>=maxlayers:
        for layer in prevlayers:
            layer.remove()
        prevlayers[:] = []    

    hexlayer = ax.hexbin(x,y, gridsize=10, alpha=0.5)
    prevlayers.append(hexlayer)
    return hexlayer,

maxlayers = 3
prevlayers = []
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=12)

enter image description here

...