52 votes

Comment tracer des polygones et des objets Shapely à l'aide de Matplotlib ?

Je souhaite utiliser Shapely pour mon projet de géométrie computationnelle. Je dois être capable de visualiser et d'afficher des polygones, des lignes et d'autres objets géométriques. J'ai essayé d'utiliser Matplotlib pour cela, mais j'ai des difficultés à le faire.

from shapely.geometry import Polygon
import matplotlib.pyplot as plt

polygon1 = Polygon([(0,5),
                    (1,1),
                    (3,0),
                    ])

plt.plot(polygon1)
plt.show()

J'aimerais pouvoir afficher ce polygone dans un graphique. Comment modifier mon code pour y parvenir ?

3 votes

1. Première question bien rédigée ! 2. Si vous pouvez obtenir des listes individuelles des x y y pour votre polygone que vous pouvez tracer comme : plt.plot(polygon_x,polygon_y) . Vous devrez également ajouter les premiers éléments à la fin pour que la ligne finale soit tracée. Je ne connais malheureusement rien à Shapely, mais j'espère que cela vous aidera !

3 votes

Ce serait plt.plot(*polygon1.exterior.xy) . De manière plus générale, vous pouvez tracer des objets de forme par le biais de descates . Une recherche sur Google pour "shapely matplotlib" devrait déjà vous donner des résultats pertinents.

0 votes

geopandas.org peut valoir la peine d'être étudiée pour cette fonctionnalité.

84voto

ap21 Points 194

Utilisez :

import matplotlib.pyplot as plt

x,y = polygon1.exterior.xy
plt.plot(x,y)

Ou, plus succinctement :

plt.plot(*polygon1.exterior.xy)

4 votes

Cela ne fonctionne pas pour les objets troués, malheureusement.

4 votes

Si vous voulez les anneaux intérieurs (alias "trous"), vous pouvez vérifier à partir de la page LinearRing en polygon1.interiors .

20voto

Micah Johnson Points 301

C'est un peu tard, mais je trouve que la façon la plus pratique de le faire est avec Geopandas comme suggéré ci-dessus, mais sans écrire dans un fichier d'abord.

from shapely.geometry import Polygon
import matplotlib.pyplot as plt
import geopandas as gpd

polygon1 = Polygon([(0,5),
                    (1,1),
                    (3,0),
                    ])

 p = gpd.GeoSeries(polygon1)
 p.plot()
 plt.show()

Polygon Plotted using Geopandas

Consultez les documents relatifs à Geopandas.GeoSeries

0 votes

La solution d'enveloppement permet également de tracer sur une carte : import mplleaflet ; p.plot() ; mplleaflet.show()

7voto

Mitchell Tracy Points 186

Si vos données sont dans un .shp fichier, je recommanderais les géopandas :

import geopandas as gpd
import matplotlib.pyplot as plt

shapefile = gpd.read_file("path/to/shapes.shp")
shapefile.plot()
plt.show()

1 votes

Y a-t-il un moyen de tracer cela sans écrire d'abord dans un fichier ?

1 votes

Vous pouvez peut-être vous en sortir en enveloppant la chaîne dans une balise StringIO comme indiqué dans cette question et de transmettre le résultat à gpd.read_file mais je ne l'ai pas testé.

2voto

C'est peut-être un peu exagéré, mais en guise d'alternative à d'autres bons commentaires, je voudrais ajouter une option d'installation de QGIS - un logiciel gratuit pour travailler avec des géométries. Il vous suffit d'enregistrer vos géométries dans un fichier de forme (.shp), geoJSON ou tout autre format et de les ouvrir avec QGIS. Si vous prévoyez un projet de grande envergure, il est peut-être plus pratique à la fin que d'utiliser matplotlib.

0 votes

Merci. Je suis en train de construire un projet qui visualise le théorème du sandwich au jambon pour mon cours de géométrie computationnelle.

0voto

nightwuffle Points 31

J'en avais assez de l'API de Matplotlib pour créer ces images, alors j'ai créé ma propre bibliothèque. Le module Python s'appelle WKTPlot et utilise Bokeh pour créer des graphiques interactifs de vos données. J'ai des exemples sur la façon de tracer des données de chaînes WKT ainsi que des données de Shapefiles.

Il prend en charge tous les types géométriques les plus galbés :

  • Point
  • MultiPoint
  • Chaîne de caractères
  • MultiLineString
  • LinearRing
  • Polygone
  • MultiPolygone
  • Collection de géométries

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X