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