Попытка анимировать диаграмму рассеяния, но выводом является пустой график без сообщения об ошибке - PullRequest
0 голосов
/ 11 апреля 2019

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

Однако, несмотря на то, что мне удалось отобразить весь набор данных как одну диаграмму рассеяния, я не смог ее анимировать.Я работаю с модулем анимации из 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()

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

Я ожидаю анимированный график рассеяния,

но я получаю карту с цветовой шкалой, но без ударов молнии.

...