Используйте python для извлечения и построения данных из netCDF

Я новичок в использовании Python для научных данных, поэтому заранее извиняюсь, если что-то неясно. У меня есть файл netCDF4 с несколькими переменными, включая широту, долготу и плотность. Я пытаюсь построить переменную плотность на базовой карте matplotlib, используя только значения плотности с координатами между 35-40 N и 100-110 W.

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

in: f = nc.Dataset('C:\\Users\\mdc\\data\\density.nc', 'r')

in: f.variables['latitude'].shape
out:(120000,)

(переменные долгота и плотность имеют одинаковую форму)

Я застрял, пытаясь найти способ извлечь только пары координат широты и долготы (и связанные с ними значения плотности), которые соответствуют критериям [35 ‹lat‹ 40 & -110 ‹lon‹ -100]. Будем признательны за любые советы о том, как это сделать.

Я попытался извлечь каждую из соответствующих переменных и скомпилировать их в 2d-массив, но я не понял, как выбрать только те данные, которые мне нужны.

lats = f.variables['latitude'][:]
lons = f.variables['longitude'][:]
dens = f.variables['density'][:]
combined = np.vstack((lats,lons,dens))

in: combined
out: array([[ -4.14770737e+01,  -3.89834557e+01,  -3.86000137e+01, ...,
      4.34283943e+01,   4.37634315e+01,   4.40338402e+01],
   [  1.75510895e+02,   1.74857147e+02,   1.74742798e+02, ...,
      7.83558655e+01,   7.81687775e+01,   7.80410919e+01],
   [  7.79418945e-02,   7.38342285e-01,   9.94934082e-01, ...,
      5.60119629e-01,  -1.60522461e-02,   5.52429199e-01]], dtype=float32)

Что касается построения, я пытаюсь отобразить пары координат разными цветами, а не размерами, в соответствии с их значением плотности.

m = Basemap(projection='robin', resolution='i', lat_0 = 37, lon_0 = -105)
m.drawcoastlines()
for lats,lons,dens in zip(lats,lons,dens):
    x,y = m(lats,lons)
    size = dens*3
    m.plot(x,y, 'r', markersize=size)
plt.show()

person mdc    schedule 23.04.2015    source источник
comment
В чем проблема выбора данных? (Не отвечайте в комментариях, проясните это в OP (Исходное сообщение). Цветовая часть проще - используйте scatter, а не plot и начните с передачи массива плотности в c kwarg: matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter   -  person cphlewis    schedule 23.04.2015
comment
Не могли бы вы опубликовать ссылку на набор данных?   -  person Daniel Watkins    schedule 01.08.2015


Ответы (1)


Выбор данных с использованием pandas (не могу установить netCDF здесь, извините, а pandas удовлетворительны):

import pandas as pd
tinyd = pd.DataFrame(np.array(
  [[ -4.14770737e+01,  -3.89834557e+01,  -3.86000137e+01,
      4.34283943e+01,   4.37634315e+01,   4.40338402e+01],
   [  1.75510895e+02,   1.74857147e+02,   1.74742798e+02,
      7.83558655e+01,   7.81687775e+01,   7.80410919e+01],
   [  7.79418945e-02,   7.38342285e-01,   9.94934082e-01,
      5.60119629e-01,  -1.60522461e-02,   5.52429199e-01]]).T,
      columns=['lat','lon','den'])

mask =  (tinyd.lat > -39) & (tinyd.lat < 44) & \
        (tinyd.lon > 80) & (tinyd.lon < 175)

toplot = tinyd[mask]
print(toplot)
         lat         lon       den
1 -38.983456  174.857147  0.738342
2 -38.600014  174.742798  0.994934
plt.scatter(toplot.lat, toplot.lon, s=90, c=toplot.den)
plt.colorbar()

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

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

person cphlewis    schedule 24.04.2015