Comment utiliser le Fond de carte (Python) pour la parcelle de NOUS 50 etats?
Je suis conscient que le paquet puissant Fond de carte peuvent être utilisées pour tracer les NOUS carte avec les frontières de l'etat. J'ai adapté cet exemple de Fond de carte GitHub référentiel pour le tracé des 48 états coloré par leur densité de la population:
Maintenant, ma question est: Est-il un moyen simple d'ajouter de l'Alaska et de Hawaii à cette carte et lieu les à un emplacement personnalisé, par exemple en bas à gauche? Quelque chose comme ceci:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.colors import rgb2hex
from matplotlib.patches import Polygon
# Lambert Conformal map of lower 48 states.
m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
# draw state boundaries.
# data from U.S Census Bureau
# http://www.census.gov/geo/www/cob/st2000.html
shp_info = m.readshapefile('st99_d00','states',drawbounds=True)
# population density by state from
# http://en.wikipedia.org/wiki/List_of_U.S._states_by_population_density
popdensity = {
'New Jersey': 438.00,
'Rhode Island': 387.35,
'Massachusetts': 312.68,
'Connecticut': 271.40,
'Maryland': 209.23,
'New York': 155.18,
'Delaware': 154.87,
'Florida': 114.43,
'Ohio': 107.05,
'Pennsylvania': 105.80,
'Illinois': 86.27,
'California': 83.85,
'Hawaii': 72.83,
'Virginia': 69.03,
'Michigan': 67.55,
'Indiana': 65.46,
'North Carolina': 63.80,
'Georgia': 54.59,
'Tennessee': 53.29,
'New Hampshire': 53.20,
'South Carolina': 51.45,
'Louisiana': 39.61,
'Kentucky': 39.28,
'Wisconsin': 38.13,
'Washington': 34.20,
'Alabama': 33.84,
'Missouri': 31.36,
'Texas': 30.75,
'West Virginia': 29.00,
'Vermont': 25.41,
'Minnesota': 23.86,
'Mississippi': 23.42,
'Iowa': 20.22,
'Arkansas': 19.82,
'Oklahoma': 19.40,
'Arizona': 17.43,
'Colorado': 16.01,
'Maine': 15.95,
'Oregon': 13.76,
'Kansas': 12.69,
'Utah': 10.50,
'Nebraska': 8.60,
'Nevada': 7.03,
'Idaho': 6.04,
'New Mexico': 5.79,
'South Dakota': 3.84,
'North Dakota': 3.59,
'Montana': 2.39,
'Wyoming': 1.96,
'Alaska': 0.42}
# choose a color for each state based on population density.
colors={}
statenames=[]
cmap = plt.cm.hot # use 'hot' colormap
vmin = 0; vmax = 450 # set range.
for shapedict in m.states_info:
statename = shapedict['NAME']
# skip DC and Puerto Rico.
if statename not in ['District of Columbia','Puerto Rico']:
pop = popdensity[statename]
# calling colormap with value between 0 and 1 returns
# rgba value. Invert color range (hot colors are high
# population), take sqrt root to spread out colors more.
colors[statename] = cmap(1.-np.sqrt((pop-vmin)/(vmax-vmin)))[:3]
statenames.append(statename)
# cycle through state names, color each one.
ax = plt.gca() # get current axes instance
for nshape,seg in enumerate(m.states):
# skip DC and Puerto Rico.
if statenames[nshape] not in ['District of Columbia','Puerto Rico']:
color = rgb2hex(colors[statenames[nshape]])
poly = Polygon(seg,facecolor=color,edgecolor=color)
ax.add_patch(poly)
plt.title('Filling State Polygons by Population Density')
plt.show()
- Note: "Tous les nouveaux logiciels de développement devriez essayer d'utiliser Cartopy chaque fois que possible, et les logiciels existants devriez commencer le processus de passage à l'utilisation Cartopy." matplotlib.org/basemap/users/intro.html
Vous devez vous connecter pour publier un commentaire.
Pour toute personne intéressée, j'ai été en mesure de le réparer moi-même. L' (x,y) les coordonnées de chaque segment (pour l'Alaska et Hawaï) doivent être traduits. J'ai aussi vers le bas l'échelle de l'Alaska à 35% avant de la traduire.
La deuxième boucle for doit être modifié comme suit:
Voici la nouvelle carte des états-unis (à l'aide de la "Verts" colormap).
La réponse ci-dessus est grande et a été très utile pour moi.
J'ai remarqué qu'il ya beaucoup de petites îles qui s'étendent sur plusieurs milles au-delà de 8 principales îles d'Hawaii. Ces petits points dans l'Arizona, la Californie et l'Oregon, (ou le Nevada et de l'Idaho) en fonction de la façon dont vous l'avez traduit Hawaii. Pour les supprimer, vous avez besoin d'une condition sur l'aire du polygone. Il est utile de faire une boucle à travers l'
states_info
objet pour ce faire: