2015-11-01 2 views
4

Я пытаюсь сгенерировать четырехпанельную анимацию изменения температуры со временем. Каждая из четырех панелей в подзаголовке должна быть анимированной картой; разница между каждой панелью является используемыми данными. Мне удалось сгенерировать анимацию, используя один набор данных (без сюжетных) со следующим кодом:Matplotlib Subplot Animation с базовой картой

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from mpl_toolkits.basemap import Basemap 

#dummy temperature data with 10 time-steps 
y=np.random.randn(10, 60, 100) 

fig = plt.figure() 
m = Basemap(projection='kav7',lon_0=0) 
lats=np.linspace(90,-90,y.shape[1]) 
lons=np.linspace(-180,180,y.shape[2]) 
lons, lats = np.meshgrid(lons,lats) 

m.drawparallels(np.arange(-90.,99.,30.), labels=[1,0,0,0]) 
m.drawmeridians(np.arange(-180.,180.,60.), labels=[0,0,0,1]) 
m.drawcoastlines(linewidth=0.25) 
m.pcolormesh(lons,lats,y[0],cmap=plt.cm.bwr, shading='flat',latlon=True) 

def init(): 
    m                                                                         

def animate(i): 
    m.pcolormesh(lons,lats,y[i],cmap=plt.cm.bwr, shading='flat',latlon=True) 
    return m 

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=10, interval=100) #interval = number of milliseconds between frames                                                                              

anim.save('movie.mp4') 

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

+0

Это был бы лучший вопрос, если бы вы связались с одним из многочисленных примеров, о которых вы говорили. http://matplotlib.org/api/animation_api.html?highlight=funcanimation#matplotlib.animation.FuncAnimation –

+0

Спасибо за редактирование в примерах! И для принятия ответа. Добро пожаловать в SO! –

ответ

1

Функция анимации должна обновлять четыре разные карты в четырех отдельных осях внутри фигуры.

  • Создайте четыре панели:

    fig, ax = plt.subplots(2, 2) 
    

Оси индексируются. Как я предложил разместить их в макете 2x2, они индексируются как 2-й массив, поэтому при создании карт ссылайтесь на оси ax[0][0], ax[0][1], ax[1][0] и ax[1][1].

  • При создании четыре экземпляра BaseMap, назначить каждую карту до различных осей с помощью ax параметра (docs).

  • В вашей функции animate измените окраску каждой оси. Назначение цветов на основе данных для отображения m_i с m_i.pcolormesh(docs), как показано на вашем вопрос.

+1

Спасибо, BBrown. Я решил это с вашей помощью. На рисунке две панели можно было бы также отрегулировать «INIT» функцию: определение функции инициализации(): fig' и настроить функцию анимации для: определение функции анимации (я): m_a.pcolormesh (Лон, lats, y [i], cmap = plt.cm.bwr, shading = 'flat', latlon = True) m_b.pcolormesh (lons, lats, y [i], cmap = plt.cm.bwr, shading = ' flat ', latlon = True) return m_a, m_b' –

Смежные вопросы