2015-04-23 48 views
2

我對使用python獲取科學數據很感興趣,所以如果有任何不清楚的地方,請提前道歉。我有一個netCDF4文件,其中包含多個變量,包括緯度,經度和密度。我想只用密度值從座標35-40 N和100-110 W. 使用python從netCDF中提取和繪製數據

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,) 

之間

(變量經度和密度具有相同的形狀)

到上繪製matplotlib底圖變密度

我被困在試圖找到一種方法來提取符合[35 < lat -110 < -110 < -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() 
+0

什麼是數據選擇問題? (不要在評論中回答,在OP(_Original Post_)中清楚說明。顏色部分比較容易 - 使用'scatter'而不是'plot'並開始將密度數組傳遞給'c' kwarg:http ://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter – cphlewis

+0

你可以發佈一個鏈接到數據集? –

回答

0

數據選擇,使用熊貓(不能在這裏安裝的netCDF,對不起,和熊貓是令人滿意的):

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() 

enter image description here

密謀底圖頂部是相同的,您可以指定不同的色彩地圖等。