Нанесите данные об осадках на карту базовой карты matplotlib

Вдохновлен примером Начертание графика с заполненными контурами с этого веб-сайта Я хочу сделать график данных о вчерашних осадках, спроецированных на карту. Однако пример с этого веб-сайта больше нельзя использовать, поскольку изменился формат данных об осадках.

Мой подход заключается в следующем:

  1. загрузите файл netCDF4 с веб-сайта Национальной метеорологической службы.
  2. откройте файл netCDF4 и извлеките соответствующую информацию
  3. создать карту с помощью Basemap
  4. спроецировать данные об осадках на карту

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

Мой код выглядит следующим образом:

from datetime import datetime, timedelta
import netCDF4
import numpy as np
import matplotlib.pyplot as plt
import os.path
import urllib
from mpl_toolkits.basemap import Basemap

# set date for precipitation (1 day ago)
precip_date  = datetime.utcnow() - timedelta(days=1)
precip_fname = 'nws_precip_1day_{0:%Y%m%d}_conus.nc'.format( precip_date )
precip_url   = 'http://water.weather.gov/precip/downloads/{0:%Y/%m/%d}/{1}'.format( precip_date, precip_fname )

# download netCDF4-file if it does not exist already
if not os.path.isfile( precip_fname ):
    urllib.urlretrieve( precip_url, precip_fname )

# read netCDF4 dataset and extract relevant data
precip_dSet = netCDF4.Dataset( precip_fname )
# spatial coordinates
precip_x    = precip_dSet['x'][:]
precip_y    = precip_dSet['y'][:]
# precipitation data (is masked array in netCDF4-dataset)
precip_data = np.ma.getdata( precip_dSet['observation'][:] )
# grid information 
precip_lat0  = precip_dSet[ precip_dSet['observation'].grid_mapping ].latitude_of_projection_origin
precip_lon0  = precip_dSet[ precip_dSet['observation'].grid_mapping ].straight_vertical_longitude_from_pole
precip_latts = precip_dSet[ precip_dSet['observation'].grid_mapping ].standard_parallel
# close netCDF4 dataset
precip_dSet.close()

fig1, ax1 = plt.subplots(1,1, figsize=(9,6) )

# create the map
my_map = Basemap( projection='stere', resolution='l', 
                  width=(precip_x.max()-precip_x.min()), 
                  height=(precip_y.max()-precip_y.min()),
                  lat_0=30,                         # what is the correct value here?
                  lon_0=precip_lon0,
                  lat_ts=precip_latts
                )
# white background
my_map.drawmapboundary( fill_color='white' )
# grey coastlines, country borders, state borders
my_map.drawcoastlines( color='0.1' )
my_map.drawcountries( color='0.5' )
my_map.drawstates( color='0.8' )

# contour plot of precipitation data
# create the grid for the precipitation data
precip_lons, precip_lats = my_map.makegrid( precip_x.shape[0], precip_y.shape[0] )
precip_xx, precip_yy     = my_map( precip_lons, precip_lats ) 
# make the contour plot
cont_precip = my_map.contourf( precip_xx, precip_yy, precip_data )

plt.show()

Вот как выглядит вывод (да, для окончательного графика необходимо настроить уровни цвета):

введите здесь описание изображения

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


person Alf    schedule 15.03.2019    source источник


Ответы (1)


Если я правильно понимаю, вы можете сделать сюжет, но хотите подсказок по добавлению дополнительных материалов?

xarray — это фантастический набор инструментов для работы с файлами netCDF. Он работает как pandas, но для файлов netCDF и является большим улучшением по сравнению с 'netCDF4':

http://xarray.pydata.org/en/stable/

Чтобы указать определенные контуры, вы можете ввести уровни:

 cont_precip = my_map.contourf( precip_xx, precip_yy, precip_data,levels=[10,20,30]) # Edit for exact contours needed

Если вы хотите, вы можете добавить цветовую полосу:

fig1.colorbar(cont_precip,ax=ax1)
person Jetman    schedule 03.04.2019