如何使用matplotlib绘制形状复杂的多边形和对象?

Eri*_*urt 10 python matplotlib shapely

我想将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()
Run Code Online (Sandbox Code Playgroud)

我希望能够在绘图中显示此多边形。我将如何更改我的代码来做到这一点?

min*_*ins 23

几何图形可以是、、、Point及其集合版本、、。LineStringPolygonMultiPointMultiLineStringMultiPolygon

观点

只需将坐标传递给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)
Run Code Online (Sandbox Code Playgroud)

线串

只需将 x 和 y 集合传递给pyplot. 它们是使用xy属性获得的。该属性返回类似以下内容:

(array('d', [3.0, 2.0, 9.0]), array('d', [6.0, -1.0, 4.0]))
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

ax.plot(line.xy[0], line.xy[1])
ax.plot(*line.xy) # Equivalent
Run Code Online (Sandbox Code Playgroud)

多边形

对于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
Run Code Online (Sandbox Code Playgroud)

它的使用方式如下:

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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

收藏

对于Multi- 集合,只需对每个元素调用绘图函数即可。


小智 19

有点晚了,但我发现最方便的方法是使用上面建议的 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()
Run Code Online (Sandbox Code Playgroud)

使用 Geopandas 绘制的多边形

查看Geopandas.GeoSeries的文档

  • @mins 很像接受的答案“如何为 x 和 y 绘制两个 numpy 数组”,而不是“如何绘制 Shapely 多边形”;) (2认同)

ap2*_*p21 17

使用:

import matplotlib.pyplot as plt

x,y = polygon1.exterior.xy
plt.plot(x,y);
Run Code Online (Sandbox Code Playgroud)

或者,更简洁地说:

plt.plot(*polygon1.exterior.xy);
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不适用于有孔的物体 (4认同)
  • 如果您想要内部环(又名“孔”),您可以从“polygon1.interiors”中的“LinearRing”进行检查。 (4认同)

Mik*_*e T 8

如果您使用的是 Shapely 2.0+,请使用该shapely.plotting模块

import shapely.plotting
from shapely.geometry import Polygon

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

shapely.plotting.plot_polygon(polygon1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • Fig, ax = plt.subplots() shapely.plotting.plot_polygon(polygon1, ax=ax) plt.savefig(f"{workspace}/test.png") (2认同)

Mit*_*acy 7

如果您的数据在.shp文件中,我会推荐 geopandas:

import geopandas as gpd
import matplotlib.pyplot as plt

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

Run Code Online (Sandbox Code Playgroud)