Я пытаюсь анимировать серию грозовых штормов, где предполагается, что каждый кадр анимации показывает удары молнии в заданном интервале и что рассеянное значение будет током молнии.
Однако, несмотря на то, что мне удалось отобразить весь набор данных как одну диаграмму рассеяния, я не смог ее анимировать.Я работаю с модулем анимации из matplotlib
Данные имеют формат, с массивом примеров положений [0], соответствующим одному удару молнии
lat
Out[2]: array([39.983 , 39.782 , 39.947 , ..., 41.8225, 40.8884, 40.9198])
lon
Out[3]: array([11.8977, 11.8266, 11.9234, ..., 9.0467, 9.3044, 9.3147])
cur
Out[4]: array([ 2., 6., 5., ..., -14., -19., -32.])
ltime
Out[5]:
DatetimeIndex(['2018-08-20 00:39:09', '2018-08-20 00:39:10',
'2018-08-20 00:39:12', '2018-08-20 00:39:18',
'2018-08-20 00:39:19', '2018-08-20 00:39:19',
'2018-08-20 00:39:26', '2018-08-20 00:39:27',
'2018-08-20 00:39:27', '2018-08-20 00:39:27',
...
'2018-08-20 10:44:15', '2018-08-20 10:44:15',
'2018-08-20 10:44:34', '2018-08-20 10:44:42',
'2018-08-20 10:45:01', '2018-08-20 10:45:01',
'2018-08-20 10:45:01', '2018-08-20 10:45:08',
'2018-08-20 10:45:24', '2018-08-20 10:45:24'],
dtype='datetime64[ns]', length=1903, freq=None)
Моя анимация выглядит следующим образом
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import matplotlib.animation as animation
import datetime as dt
m = Basemap(projection = 'mill',llcrnrlat = 30, urcrnrlat=60,\
llcrnrlon= -10, urcrnrlon= 30,resolution='l')
m.drawcoastlines()
m.fillcontinents()
m.drawmapboundary()
# draw parallels and meridians.
parallels = np.arange(0.,181,1.)
m.drawparallels(parallels,labels=[False,False,True,False])
meridians = np.arange(0.,361.,1.)
meridians = m.drawmeridians(meridians,labels=[True,False,False,False])
"""
nedestående er animationen
"""
x,y = m(lon,lat)
col = cur
scat = plt.scatter(x, y, c=col,marker = 'o', s=20, alpha=1 ,cmap='seismic')
plt.clim(-50,50)
plt.colorbar();
plt.title('Lightning with current')
def init():
return scat,
def animate(i):
startP = ltime[0] + dt.timedelta(minutes=10*i)
slutP = ltime[0] + dt.timedelta(minutes=10*(i+1))
res = (slutP >= ltime) & (startP < ltime)
x, y = m(lon[res], lat[res])
scat.set_data(x, y)
col = cur[res]
scat.set_color(col)
return scat,
anim = animation.FuncAnimation(plt.gcf(), animate, init_func=init,
frames=np.size(lat), interval=100, blit=True)
plt.show()
Чтобы уточнить, при определенной настройке временного интервала для каждого кадра это работает на отдельном графике, где я строю только позиции.
Я ожидаю анимированный график рассеяния,
но я получаю карту с цветовой шкалой, но без ударов молнии.