2017-12-05 20 views
0

위성 데이터 세트 file here을 가지고 있는데, 나는 & lon과 오존 값을위한 2D 배열에 대한 그리드를 만들었습니다.basemap & contourf, Python

지도에서 데이터의 contourf를 플롯하기 위해 투영 좌표가 필요하다는 것을 알고 있지만 그리드가 정사각형이 아닌 (144x24) 길을 찾을 수는 없습니다. 지리적 영역 (0 ~ 360, -30 ~ 30)을 다루고 있으며 정사각형 픽셀이 필요합니다.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 
from mpl_toolkits.basemap import Basemap, cm 
%matplotlib inline 

path = '/home/rafaella/month_files_CSV/O3_COLUMNS_MATCHED_fv0005_200306.csv' 
df = pd.read_csv(path, skiprows=1) 

df = pd.read_csv(path, delim_whitespace=True) 
lat = np.array(df['AVG_LAT']) 
lon = np.array(df['AVG_LON']) 
toc = np.array(df['TROP_COL']) 

#new grid for lon[0,360] lat[-30,30] 

lomin = 0 
lomax = 360 
lamin = -30 
lamax = 30 
stp = 2.5 

loc_lon = np.zeros(int((lomax-lomin)/stp)) 
loc_lat = np.zeros(int((lamax-lamin)/stp)) 

for i in range(0,len(loc_lon)): 
    loc_lon[i] = i*stp +lomin 

for j in range(0,len(loc_lat)): 
    loc_lat[j] = j*stp +lamin 

mtoc_local = np.zeros((len(loc_lon),len(loc_lat))) 
sdtoc_local = np.zeros((len(loc_lon),len(loc_lat))) 
mtoc_local[:,:] = np.nan  
sdtoc_local[:,:] = np.nan 

for i in range (0, len(loc_lon)): 
    for j in range (0,len(loc_lat)): 
     ix = np.where((lon>=loc_lon[i])& (lat>=loc_lat[j]) & (lon<loc_lon[i]+stp) & (lat<loc_lat[j]+stp))[0] 
     mtoc_local[i,j]=np.nanmean(toc[ix]) 
     sdtoc_local[i,j]=np.nanstd(toc[ix]) 

fig = plt.figure(figsize=(20, 5)) 
map = Basemap(llcrnrlon=0,llcrnrlat=-30, urcrnrlon=360.,urcrnrlat=30.,\ 
     rsphere=(6378137.00,6356752.3142),\ 
     resolution='l',projection='merc',\ 
     lat_0=0,lon_0=-30.,lat_ts=30.) 

map.drawcoastlines() 
# draw parallels 
map.drawparallels(np.arange(-30,30,10),labels=[1,1,0,1]) 
# draw meridians 
map.drawmeridians(np.arange(-180,180,20),labels=[1,1,0,1]) 

map = plt.contourf(loc_lon, loc_lat , mtoc_local.T, vmin=210, vmax=350, cmap='RdPu') 
plt.colorbar(orientation='horizontal', ticks=[200, 220, 240, 260, 280, 300, 320, 340]) 
plt.title('Tropical TOC monthly mean 06,2009') 

plt.show() 

그것은 아주 잘지도 또는 데이터 있지만 둘을 나타내는,

데이터를 게시하는 것은 매우 긴하지만 지금까지 내 코드입니다. 여기에 별도로 map

real data

모두의 이미지가 내가 파이썬에 아주 새로운 오전, 한 달 전에 시작, 그래서 여전히 모든 기능과 라이브러리 나에게 익숙하지 않다.

+0

처럼 보이는, 또는/toc 변수? [문제 재현] (https://stackoverflow.com/help/mcve) 샘플 데이터가 없으면 도움을주기가 매우 어렵습니다. –

+0

물론, 문제는 투영 된 좌표와 같습니다. 데이터에 주어진 좌표를 사용하지 않고 그리드를 사용하고 있습니다. –

+0

저는 Basemap이 [0,360]의 범위에서 경도를 좋아하지는 않지만 [-180, 180]이라고 생각합니다. 비록 이것이 당신의 문제의 근본 원인인지 확실하지 않습니다. –

답변

1

코드에 두 가지 문제점이 있습니다. 먼저 x,y = map(lon, lat)을 사용하여 좌표계에 투영법을 적용해야합니다. 그러나 loc_lon 및 loc_lat의 크기가 다르므로이 경우 오류가 발생합니다. x 및 y 벡터를 contourf 함수에 전달하는 대신 z (mtoc_local.T)와 같은 모양의 배열을 전달할 수 있습니다. np.meshgrid을 사용하여 생성 할 수 있습니다. 길고도 짧은 이야기는 다음 세 줄

X, Y = np.meshgrid(loc_lon, loc_lat) 
x,y = map(X,Y) 
map = plt.contourf(x, y , mtoc_local.T, vmin=210, vmax=350, cmap='RdPu') 

으로 contourf 명령 라인을 교체하고 결과는 위도/경도를 당신이의 예 중 하나 CSV 파일을 게시 할 수이 enter image description here

+0

감사합니다. 그것은 효과가있었습니다. 나 또한 Cartopy를 시도하고 잘 작동합니다. –

+1

@RafaellaChiarella 감사의 적절한 방법은 동의 버튼을 클릭하는 것입니다. – swatchai