如何使用 Matplotlib 绘制 Shapely 多边形和对象?

我想用夏普利做我的计算几何项目。我需要能够可视化和显示多边形,线,和其他几何对象为此。我曾经尝试使用 Matplotlib,但是我在这方面遇到了麻烦。

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


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


plt.plot(polygon1)
plt.show()

我希望能够在一个图中显示这个多边形。我该如何更改我的代码来执行此操作?

95670 次浏览

这可能有点夸张,但作为其他好评的替代,我想添加一个安装 QGIS 的选项——一个用于处理几何图形的免费软件。您所需要做的就是将几何图形保存为形状文件(。)、 geJSON 或任何其他格式,并用 QGIS 打开它。如果你正在计划一个大项目,最后可能会比使用 matplotlib 更方便。

用途:

import matplotlib.pyplot as plt


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

或者,更简洁地说:

plt.plot(*polygon1.exterior.xy)

如果你的数据在 .shp文件中,我推荐地熊猫:

import geopandas as gpd
import matplotlib.pyplot as plt


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


虽然有点晚,但是我发现最方便的方法是使用 Geopandas,就像上面建议的那样,但是不需要先写入文件。

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

看看 地理熊猫,地理系列的文件

我厌倦了 Matplotlib 用于创建这些情节图像的蹩脚 API,所以我创建了自己的库。Python 模块称为 WKTPlot,它使用 Bokeh对数据进行交互式绘图。我有一些关于如何绘制 WKT 字符串数据以及来自 Shapefiles 的数据的例子。

它支持所有形状最好的几何类型:

  • 得分
  • 多点
  • LineString
  • MultiLineString
  • 线性戒指
  • 多边形
  • 多边形
  • 几何收藏

下面是一个使用 matplotlib 补丁的解决方案,它也能解释漏洞:

import numpy as np
import shapely.geometry as sg
import matplotlib.pyplot as plt
import matplotlib.patches as patches




def add_polygon_patch(coords, ax, fc='blue'):
patch = patches.Polygon(np.array(coords.xy).T, fc=fc)
ax.add_patch(patch)




border = [(-10, -10), (-10, 10), (10, 10), (10, -10)]  # Large square
holes = [
[(-6, -2), (-6, 2), (-2, 2), (-2, -2)],  # Square hole
[(2, -2), (4, 2), (6, -2)]               # Triangle hole
]
region = sg.Polygon(shell=border, holes=holes)


fig, ax = plt.subplots(1, 1)


add_polygon_patch(region.exterior, ax)
for interior in region.interiors:
add_polygon_patch(interior, ax, 'white')
        

ax.axis('equal')
plt.show()

Polygon region with polygon holes from a

你也可以跟随 用户手册中的源代码: (点击“源代码”)。

这里提供的“源代码”是 没有实际的 Shapely 源代码,但是用户手册中用来创建示例的代码。使用这个“示例代码”从塑造用户手册允许您快速创建图像在相同的友好样式。

Screenshot from https://shapely.readthedocs.io/en/latest/manual.html#linestrings november 2021

您将需要一个简短、非常简单的 python 文件: https://github.com/Toblerity/Shapely/blob/main/docs/code/figures.py。(摘自 https://gis.stackexchange.com/questions/362492/shapely-examples-use-figures-what-is-this-library)

几何图形可以是 PointLineStringPolygon,以及它们的集合版本 MultiPointMultiLineStringMultiPolygon

得分

把坐标传给 pyplot:

points = (point1, point2, point3, point3D)
xs = [point.x for point in points]
ys = [point.y for point in points]


fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.scatter(xs, ys)

LineString

只需将 x 和 y 集合传递给 pyplot。它们是使用 xy属性获得的。这个属性返回如下内容:

(array('d', [3.0, 2.0, 9.0]), array('d', [6.0, -1.0, 4.0]))

可以这样使用:

ax.plot(line.xy[0], line.xy[1])
ax.plot(*line.xy) # Equivalent

多边形

对于 Polygon目前接受的答案确实只适用于退化的多边形,也就是没有孔的多边形。这里是一个版本的工作与颜色和其他属性的通常关键字的任何多边形。这不是我的设计,只是改编自 GeoPandas 来源

import numpy as np
from matplotlib.path import Path
from matplotlib.patches import PathPatch
from matplotlib.collections import PatchCollection




# Plots a Polygon to pyplot `ax`
def plot_polygon(ax, poly, **kwargs):
path = Path.make_compound_path(
Path(np.asarray(poly.exterior.coords)[:, :2]),
*[Path(np.asarray(ring.coords)[:, :2]) for ring in poly.interiors])


patch = PathPatch(path, **kwargs)
collection = PatchCollection([patch], **kwargs)
    

ax.add_collection(collection, autolim=True)
ax.autoscale_view()
return collection

它是这样使用的:

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




# Input polygon with two holes
# (remember exterior point order is ccw, holes cw else
# holes may not appear as holes.)
polygon = Polygon(shell=((0,0),(10,0),(10,10),(0,10)),
holes=(((1,3),(5,3),(5,1),(1,1)),
((9,9),(9,8),(8,8),(8,9))))


fig, ax = plt.subplots()
plot_polygon(ax, polygon, facecolor='lightblue', edgecolor='red')

enter image description here

收款

对于 Multi集合,只需调用每个元素上的 plot 函数。