2017-03-10 4 views
4

미국지도에서 시각화 할 데이터가 있습니다. 나는 미국 밖의 땅 (남서쪽의 멕시코와 북동쪽의 캐나다)에 어떤 색깔도 원하지 않습니다. contourf에서 어떻게 그 영역을 마스크 할 수 있습니까? 주의 경계가 그려지는지 여부는 중요하지 않습니다.미국 대륙 (멕시코 및 캐나다 지역) 외곽에서베이스 맵에서 윤곽선을 제거하는 방법은 무엇입니까?

코드는 다음과 같습니다

색상 미국 경계 외부에서 다음 이미지 enter image description here 주를 생산
import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap, cm, maskoceans 
from scipy.interpolate import griddata 
np.random.seed(77) 



lllat = 24.396308 
lllon = -124.848974 
urlat = 49.384358 
urlon = -66.885444 
m = Basemap(llcrnrlat=lllat, 
urcrnrlat=urlat, 
llcrnrlon=lllon, 
urcrnrlon=urlon, 
resolution='i', projection='cyl') 
m.drawcountries(linewidth=1.0) 
m.drawstates(linewidth=1.0, color='lightgray') 
m.drawlsmask(land_color='gray',ocean_color="#b0c4de", lakes=True) 

#create 100 random latitudes 
lats = np.random.randint(low=lllat-1, high=urlat+1, size=1000) + np.random.ranf(size=1000) 
#create 100 random longitudes 
lons = np.random.randint(low=lllon-1, high=urlon+1, size=1000) + np.random.ranf(size=1000) 
#create 100 random values/probabilities 
probabilities = np.random.random(size=1000) 


#now use meshgrid and contourf to visualize it 
mlon, mlat = m(*(lons, lats)) 
# grid data 
numcols, numrows = 1000, 1000 
xi = np.linspace(mlon.min(), mlon.max(), numcols) 
yi = np.linspace(mlat.min(), mlat.max(), numrows) 

xi, yi = np.meshgrid(xi, yi) 
# interpolate 
x, y, z = mlon, mlat, probabilities 
zi = griddata((mlon, mlat), probabilities, (xi, yi), method='nearest', rescale=False) 
data = maskoceans(xi, yi, zi) 
con = m.contourf(xi, yi, data, cmap=plt.get_cmap('YlOrRd')) 
cbar = m.colorbar(con,location='right',pad="3%") 
plt.show() 

, 내가 그들을 제거 할 싶어요.

나는 미국에 존재하지 않지만 경계선 밖의 일부 부분은 여전히 ​​contourf 색상으로 표시되는 점과 lons에서 점을 제거하려고했습니다.

해양 마스크으로 물을 가릴 수는 있지만 멕시코와 캐나다에서는 해당 포인트를 가릴 수 없습니다.

참고 :이 루프에 대한 해결책은 모든 격자 점 이상 미국에없는 모든 지점에 대한 에 유모ZI을 설정하지만 내 실제 데이터의 크기가 주어진 너무 많은 계산이다 아니다 나를위한 해결책.

+0

나는 회색과 회색으로 그려져 있고 멕시코와 캐나다가 contourf를 통해 그려 낼 수 있을지도 모르겠다. – Ash

답변

1

나는 contourf 위에서 멕시코와 캐나다 다각형을 다시 그리게되었다. 다운로드 한 국가 모양 파일은 here입니다. 코드는 다음과 같습니다.

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap, cm, maskoceans 
from scipy.interpolate import griddata 
from matplotlib.patches import Polygon as MplPolygon 
import shapefile 
import pdb 
np.random.seed(77) 



lllat = 24.396308 
lllon = -124.848974 
urlat = 49.384358 
urlon = -66.885444 
m = Basemap(llcrnrlat=lllat, 
urcrnrlat=urlat, 
llcrnrlon=lllon, 
urcrnrlon=urlon, 
resolution='i', projection='cyl') 
m.drawcountries(linewidth=1.0) 
m.drawstates(linewidth=1, color='lightgray') 
m.drawcoastlines() 
m.drawlsmask(land_color='gray',ocean_color="#b0c4de", lakes=True) 

#create 100 random latitudes 
lats = np.random.randint(low=lllat-1, high=urlat+1, size=1000) + np.random.ranf(size=1000) 
#create 100 random longitudes 
lons = np.random.randint(low=lllon-1, high=urlon+1, size=1000) + np.random.ranf(size=1000) 
#create 100 random values/probabilities 
probabilities = np.random.random(size=1000) 


#now use meshgrid and contourf to visualize it 
mlon, mlat = m(*(lons, lats)) 
# grid data 
numcols, numrows = 1000, 1000 
xi = np.linspace(mlon.min(), mlon.max(), numcols) 
yi = np.linspace(mlat.min(), mlat.max(), numrows) 

xi, yi = np.meshgrid(xi, yi) 
# interpolate 
x, y, z = mlon, mlat, probabilities 
zi = griddata((mlon, mlat), probabilities, (xi, yi), method='nearest', rescale=False) 
data = maskoceans(xi, yi, zi) 
con = m.contourf(xi, yi, data, cmap=plt.get_cmap('YlOrRd')) 
cbar = m.colorbar(con,location='right',pad="3%") 

world_shp_info = m.readshapefile('./data/CNTR_2014_10M_SH/Data/CNTR_RG_10M_2014','world',drawbounds=False) 

ax = plt.gca() 
for shapedict,state in zip(m.world_info, m.world): 
    if shapedict['CNTR_ID'] not in ['CA', 'MX']: continue 
    poly = MplPolygon(state,facecolor='gray',edgecolor='gray') 
    ax.add_patch(poly) 
plt.show() 

이 결과는 enter image description here입니다.

나는 그것을하는 더 똑똑한 방법이 있어야한다고 생각합니다.