【问题标题】:How do I plot Shapely polygons and objects using Matplotlib?如何使用 Matplotlib 绘制 Shapely 多边形和对象?
【发布时间】:2019-08-26 14:10:22
【问题描述】:

我想在我的计算几何项目中使用 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()

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

【问题讨论】:

  • 1.第一个问题写得真好! 2. 如果您可以获得多边形的xy 坐标的单独列表,您可以绘制如下:plt.plot(polygon_x,polygon_y)。您还必须将第一个元素附加到末尾以绘制最后一条线。不幸的是,我对匀称一无所知,但希望这会有所帮助!
  • 应该是plt.plot(*polygon1.exterior.xy)。更一般地,您可以通过descates 绘制匀称的对象。谷歌搜索“shapely matplotlib”应该已经给你相关的结果。
  • geopandas.org 可能值得研究此功能。

标签: python matplotlib shapely


【解决方案1】:

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

【讨论】:

  • 谢谢。我正在为我的计算几何课程构建一个可视化 Ham Sandwich 定理的项目。
【解决方案2】:

用途:

import matplotlib.pyplot as plt

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

或者,更简洁:

plt.plot(*polygon1.exterior.xy)

【讨论】:

  • 不幸的是,这不适用于有洞的物体
  • 如果您想要内环(又名“孔”),您可以通过polygon1.interiors 中的LinearRings 进行检查。
【解决方案3】:

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

import geopandas as gpd
import matplotlib.pyplot as plt

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

【讨论】:

  • 有什么方法可以在不先写入文件的情况下绘制它?
  • 您可以通过将字符串包装在StringIO 中,如this question 所示,并将结果传递给gpd.read_file,尽管我尚未对此进行测试。
【解决方案4】:

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

查看Geopandas.GeoSeries 的文档

【讨论】:

  • 包装解决方案还有助于在地图上绘图:import mplleaflet; p.plot(); mplleaflet.show()
  • 这回答“我如何绘制 Geopandas GeoSeries”,而不是“我如何绘制 Shapely 多边形”
【解决方案5】:

我厌倦了 Matplotlib 用于创建这些绘图图像的 janky API,因此我创建了自己的库。 Python 模块称为WKTPlot,并使用Bokeh 制作数据的交互式绘图。我有关于如何绘制 WKT 字符串数据以及来自 Shapefile 的数据的示例。

它支持所有最匀称的几何类型:

  • 多点
  • 线串
  • 多行字符串
  • 线性环
  • 多边形
  • 多多边形
  • 几何集合

【讨论】:

  • 值得一提的是,可以将原始问题中的“Polgyon”对象直接传递给该模块。 GitHub 上的示例似乎建议您只能使用 (WKT) 字符串,但该模块的 add_shape 方法也接受许多 Shapely 几何图形。
【解决方案6】:

这是一个使用 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()

【讨论】:

    【解决方案7】:

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

    此处提供的“源代码”不是实际的 Shapely 源代码,而是用户手册中用于创建示例的代码。使用 Shapely 用户手册中的“示例代码”,您可以快速创建具有相同友好风格的图像。

    您将需要“figures”模块,它只是一个简短的、非常简单的 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

    【讨论】:

      【解决方案8】:

      几何可以是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)
      

      线串

      只需将 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
      

      多边形

      对于Polygoncurrently accepted answer 确实只适用于退化的多边形,即没有孔的多边形。这是一个适用于任何多边形的版本,带有颜色和其他属性的常用关键字。这不是我的设计,只是改编自GeoPandas source

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

      收藏

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 2023-02-17
        • 2012-10-04
        • 2013-07-06
        • 2020-09-07
        • 1970-01-01
        相关资源
        最近更新 更多