2017-02-26 2 views
2

Je dessinais des données sur carte de base et d'utiliser les frontières de l'État dans l'arrière-plan en utilisant this piece of code:dessiner abréviations d'état dans matplotlib basemap

from mpl_toolkits.basemap import Basemap, cm 
# requires netcdf4-python (netcdf4-python.googlecode.com) 
from netCDF4 import Dataset as NetCDFFile 
import numpy as np 
import matplotlib.pyplot as plt 

# plot rainfall from NWS using special precipitation 
# colormap used by the NWS, and included in basemap. 

nc = NetCDFFile('../../../examples/nws_precip_conus_20061222.nc') 
# data from http://water.weather.gov/precip/ 
prcpvar = nc.variables['amountofprecip'] 
data = 0.01*prcpvar[:] 
latcorners = nc.variables['lat'][:] 
loncorners = -nc.variables['lon'][:] 
lon_0 = -nc.variables['true_lon'].getValue() 
lat_0 = nc.variables['true_lat'].getValue() 
# create figure and axes instances 
fig = plt.figure(figsize=(8,8)) 
ax = fig.add_axes([0.1,0.1,0.8,0.8]) 
# create polar stereographic Basemap instance. 
m = Basemap(projection='stere',lon_0=lon_0,lat_0=90.,lat_ts=lat_0,\ 
      llcrnrlat=latcorners[0],urcrnrlat=latcorners[2],\ 
      llcrnrlon=loncorners[0],urcrnrlon=loncorners[2],\ 
      rsphere=6371200.,resolution='l',area_thresh=10000) 
# draw coastlines, state and country boundaries, edge of map. 
m.drawcoastlines() 
m.drawstates() 
m.drawcountries() 
plt.show() 

est-il un moyen d'attirer des noms d'état sur la carte (par exemple CA pour la Californie) ?

Répondre

4
import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap as Basemap 
from matplotlib.patches import Polygon 

short_state_names = { 
     'AK': 'Alaska', 
     'AL': 'Alabama', 
     'AR': 'Arkansas', 
     'AS': 'American Samoa', 
     'AZ': 'Arizona', 
     'CA': 'California', 
     'CO': 'Colorado', 
     'CT': 'Connecticut', 
     'DC': 'District of Columbia', 
     'DE': 'Delaware', 
     'FL': 'Florida', 
     'GA': 'Georgia', 
     'GU': 'Guam', 
     'HI': 'Hawaii', 
     'IA': 'Iowa', 
     'ID': 'Idaho', 
     'IL': 'Illinois', 
     'IN': 'Indiana', 
     'KS': 'Kansas', 
     'KY': 'Kentucky', 
     'LA': 'Louisiana', 
     'MA': 'Massachusetts', 
     'MD': 'Maryland', 
     'ME': 'Maine', 
     'MI': 'Michigan', 
     'MN': 'Minnesota', 
     'MO': 'Missouri', 
     'MP': 'Northern Mariana Islands', 
     'MS': 'Mississippi', 
     'MT': 'Montana', 
     'NA': 'National', 
     'NC': 'North Carolina', 
     'ND': 'North Dakota', 
     'NE': 'Nebraska', 
     'NH': 'New Hampshire', 
     'NJ': 'New Jersey', 
     'NM': 'New Mexico', 
     'NV': 'Nevada', 
     'NY': 'New York', 
     'OH': 'Ohio', 
     'OK': 'Oklahoma', 
     'OR': 'Oregon', 
     'PA': 'Pennsylvania', 
     'PR': 'Puerto Rico', 
     'RI': 'Rhode Island', 
     'SC': 'South Carolina', 
     'SD': 'South Dakota', 
     'TN': 'Tennessee', 
     'TX': 'Texas', 
     'UT': 'Utah', 
     'VA': 'Virginia', 
     'VI': 'Virgin Islands', 
     'VT': 'Vermont', 
     'WA': 'Washington', 
     'WI': 'Wisconsin', 
     'WV': 'West Virginia', 
     'WY': 'Wyoming' 
} 

m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49, 
      projection='lcc',lat_1=33,lat_2=45,lon_0=-95) 
# data from U.S Census Bureau 
# http://www.census.gov/geo/www/cob/st2000.html 
shp_info = m.readshapefile('st99_d00','states',drawbounds=True) 
printed_names = [] 
for shapedict,state in zip(m.states_info, m.states): 
    short_name = short_state_names.keys()[short_state_names.values().index(shapedict['NAME'])] 
    if short_name in printed_names: continue 
    # center of polygon 
    x, y = np.array(state).mean(axis=0) 
    # You have to align x,y manually to avoid overlapping for little states 
    plt.text(x+.1, y, short_name, ha="center") 
    printed_names += [short_name,] 

m.drawparallels(np.arange(25,65,20),labels=[1,0,0,0]) 
m.drawmeridians(np.arange(-120,-40,20),labels=[0,0,0,1]) 
plt.title('The United States of North America') 
plt.show() 

enter image description here

+0

Merci @Serenity, je pense qu'il ya un problème avec le Michigan et le Wisconsin, ne semble pas être lié au code, vous avez des idées sur pourquoi ceux-ci sont mis là? – Ash

+0

Trouvés que MI et WI ont plusieurs îles et que votre code dessinait les abréviations d'état sur ces îles, devrait sauter ces îles et dessiner le nom sur la partie principale de l'état. – Ash

2

La réponse @Serenity est juste, mais où les abréviations doivent être placés doit être modifié manuellement pour certains petits états (par exemple regarder FL). Au lieu de la moyenne de tous les points du polygone d'un état, on pourrait dessiner un convexel sur ces points et utiliser la moyenne de ces points. Cela ne changerait pas grand-chose mais pourrait être utile pour quelqu'un.

Il existe également un problème: certains états ont plusieurs petits îlots que nous ne dessinons pas ici (en ignorant ces îlots lorsque short_name est dans print_names). Dans le cas du Michigan et du Wisconsin, ces îles viennent avant l'état principal et ne sont donc pas dessinées. J'ai vérifié et le principal Michigan est le numéro 4 et pour le Wisconsin le numéro 3, donc nous venons de dessiner le nom de l'état pour le 4ème Michigan et pour le 3ème Wisonsin.

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap as Basemap 
from matplotlib.patches import Polygon 
from scipy.spatial import ConvexHull, Voronoi 
import pdb 

short_state_names = { 
     'AK': 'Alaska', 
     'AL': 'Alabama', 
     'AR': 'Arkansas', 
     'AS': 'American Samoa', 
     'AZ': 'Arizona', 
     'CA': 'California', 
     'CO': 'Colorado', 
     'CT': 'Connecticut', 
     'DC': 'District of Columbia', 
     'DE': 'Delaware', 
     'FL': 'Florida', 
     'GA': 'Georgia', 
     'GU': 'Guam', 
     'HI': 'Hawaii', 
     'IA': 'Iowa', 
     'ID': 'Idaho', 
     'IL': 'Illinois', 
     'IN': 'Indiana', 
     'KS': 'Kansas', 
     'KY': 'Kentucky', 
     'LA': 'Louisiana', 
     'MA': 'Massachusetts', 
     'MD': 'Maryland', 
     'ME': 'Maine', 
     'MI': 'Michigan', 
     'MN': 'Minnesota', 
     'MO': 'Missouri', 
     'MP': 'Northern Mariana Islands', 
     'MS': 'Mississippi', 
     'MT': 'Montana', 
     'NA': 'National', 
     'NC': 'North Carolina', 
     'ND': 'North Dakota', 
     'NE': 'Nebraska', 
     'NH': 'New Hampshire', 
     'NJ': 'New Jersey', 
     'NM': 'New Mexico', 
     'NV': 'Nevada', 
     'NY': 'New York', 
     'OH': 'Ohio', 
     'OK': 'Oklahoma', 
     'OR': 'Oregon', 
     'PA': 'Pennsylvania', 
     'PR': 'Puerto Rico', 
     'RI': 'Rhode Island', 
     'SC': 'South Carolina', 
     'SD': 'South Dakota', 
     'TN': 'Tennessee', 
     'TX': 'Texas', 
     'UT': 'Utah', 
     'VA': 'Virginia', 
     'VI': 'Virgin Islands', 
     'VT': 'Vermont', 
     'WA': 'Washington', 
     'WI': 'Wisconsin', 
     'WV': 'West Virginia', 
     'WY': 'Wyoming' 
} 

m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49, 
      projection='lcc',lat_1=33,lat_2=45,lon_0=-95) 
# data from U.S Census Bureau 
# http://www.census.gov/geo/www/cob/st2000.html 
shp_info = m.readshapefile('./data/us_states_st99/st99_d00','states',drawbounds=True) 
printed_names = [] 
mi_index = 0 
wi_index = 0 
for shapedict,state in zip(m.states_info, m.states): 
    draw_state_name = True 
    short_name = short_state_names.keys()[short_state_names.values().index(shapedict['NAME'])] 
    if short_name in printed_names and short_name not in ['MI', 'WI']: 
     continue 
    if short_name == 'MI': 
     if mi_index != 3: 
      draw_state_name = False 
     mi_index += 1 
    if short_name == 'WI': 
     if wi_index != 2: 
      draw_state_name = False 
     wi_index += 1 
    # center of polygon 
    x, y = np.array(state).mean(axis=0) 
    hull = ConvexHull(state) 
    hull_points = np.array(state)[hull.vertices] 
    #center of convex hull over the polygon points 
    x, y = hull_points.mean(axis=0) 
    if draw_state_name: 
     # You have to align x,y manually to avoid overlapping for little states 
     plt.text(x+.1, y, short_name, ha="center") 
    printed_names += [short_name,] 

m.drawparallels(np.arange(25,65,20),labels=[1,0,0,0]) 
m.drawmeridians(np.arange(-120,-40,20),labels=[0,0,0,1]) 
plt.title('The United States of North America') 
plt.show() 

Si vous vous souciez d'autres îles d'autres états que vous devez faire quelque chose de similaire avec ces îles (par exemple de ne pas continuer, dessiner le polygone, mais pas le nom, ou tout ce que vous devez faire).

enter image description here

+1

Où avez-vous téléchargé votre fond de carte? Le lien ne semble plus fonctionner. –

+0

st99_d00 dans https://github.com/matplotlib/basemap/tree/master/examples – Ash