Compte tenu du fichier de forme disponible ici : Je voudrais étiqueter chaque polygone (comté) sur la carte. Est-ce possible avec GeoPandas?
import geopandas as gpd
import matplotlib.pyplot as plt
%matplotlib inline
shpfile=<Path to unzipped .shp file referenced and linked above>
c=gpd.read_file(shpfile)
c=c.loc[c['GEOID'].isin(['26161','26093','26049','26091','26075','26125','26163','26099','26115','26065'])]
c.plot()
Merci d'avance!
c['geometry']
Est une série composée d'objets shapely.geometry.polygon.Polygon
. Vous pouvez le vérifier en cochant
In [23]: type(c.ix[23, 'geometry'])
Out[23]: shapely.geometry.polygon.Polygon
De la Shapely docs il y a une méthode representative_point()
qui
Renvoie un point calculé à moindre coût qui se trouve à l'intérieur de l'objet géométrique.
Cela semble idéal pour une situation dans laquelle vous devez étiqueter les objets polygonaux! Vous pouvez ensuite créer une nouvelle colonne pour votre geopandas
dataframe
, 'coords'
Comme ça
c['coords'] = c['geometry'].apply(lambda x: x.representative_point().coords[:])
c['coords'] = [coords[0] for coords in c['coords']]
Maintenant que vous disposez d'un ensemble de coordonnées se rapportant à chaque objet polygone (chaque comté), vous pouvez annoter votre tracé en itérant dans votre cadre de données
c.plot()
for idx, row in c.iterrows():
plt.annotate(s=row['NAME'], xy=row['coords'],
horizontalalignment='center')
pas besoin de boucler, voici comment annoter avec apply:
ax = df.plot()
df.apply(lambda x: ax.annotate(s=x.NAME, xy=x.geometry.centroid.coords[0], ha='center'),axis=1);