2017-03-10 177 views
4

我有一個數據在美國地圖上可視化。我不想在美國以外的國家(西南部的墨西哥和東北部的加拿大境內)使用任何顏色。我怎樣才能從contourf中遮蓋這些區域?請注意,這些狀態邊界是否繪製並不重要。如何從底圖去除美國大陸以外(墨西哥和加拿大境內)的輪廓顏色?

的代碼是:

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

產生以下圖像enter image description here 注意的顏色以外的美國邊界,我希望他們被移除。

我嘗試從lats和lons中刪除點,這些點在美國並不存在,但仍然以邊界外的某些部分爲輪廓。

我可以用oceanmask掩蓋水域,但無法掩蓋墨西哥和加拿大的這些要點。

注:有循環的解決方案在所有網格點,並設置所有那些沒有在美國點,但就是這麼計算成本給予我的實際數據的大小是不是我的解決方案。

+0

我想也許我可以用灰色重新繪製那些墨西哥和加拿大在輪廓上的狀態,但我不知道如何。 – 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

我認爲應該有一個更明智的做法。