2017-03-10 1 views
4

Ich habe Daten zur Visualisierung auf der US-Karte. Ich will keine Farbe auf Ländern außerhalb der Vereinigten Staaten (in Mexiko im Südwesten und Kanada im Nordosten). Wie kann ich diese Bereiche von contourf maskieren? Beachten Sie, dass es nicht wichtig ist, ob diese Zustandsgrenzen gezeichnet werden oder nicht.Wie können Konturfarben außerhalb der kontinentalen USA (innerhalb von Mexiko und Kanada) von der Grundkarte entfernt werden?

Der Code ist:

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

, die folgendes Bild enter image description here Beachten Sie die Farben, die außerhalb der US-Grenzen produziert, ich möchte, dass sie entfernt werden.

Ich habe versucht, Punkte von Lats und Lons zu entfernen, die nicht in den USA existieren, aber immer noch einige Teile außerhalb der Grenze konturfarben sind.

Ich könnte Wasser mit oceanmask Maske aber konnte diese Punkte in Mexiko und Kanada nicht maskieren.

Hinweis: Es gibt eine Lösung über alle Gitterpunkte auf Schleife und setzen zi-nan für all jene Punkte, die nicht in den USA sind, aber das ist so rechnerisch teuer angesichts meiner tatsächlichen Datengröße, die keine ist Lösung für mich.

+0

Ich dachte, vielleicht könnte ich in grauer Farbe diese Mexiko und Kanada Staaten über die Kontur neu zeichnen, aber ich bin mir nicht sicher, wie. – Ash

Antwort

1

Ich zeichnete Mexiko und Kanada Polygone wieder über die Kontur. Heruntergeladene Länder Shape-Datei von here. Der Code ist wie:

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

und das ist das Ergebnis enter image description here.

Ich denke, es sollte eine klügere Art, es zu tun.

Verwandte Themen