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

m1m5dgzv  于 2023-04-21  发布在  其他
关注(0)|答案(9)|浏览(313)

我想使用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()

我希望能够在绘图中显示这个多边形。我该如何更改代码来实现这一点?

pw136qt2

pw136qt21#

用途:

import matplotlib.pyplot as plt

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

或者,更简洁地说:

plt.plot(*polygon1.exterior.xy)
iyfjxgzm

iyfjxgzm2#

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

jobtbby3

jobtbby33#

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

多边形

对于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- collections,只需在每个元素上调用plot函数。

um6iljoc

um6iljoc4#

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

import geopandas as gpd
import matplotlib.pyplot as plt

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

91zkwejq5#

您也可以“跟随”Shapely用户手册中的源代码:(点击“源代码”)。
这里提供的“源代码”不是真正的Shapely源代码,而是用户手册中用于创建示例的代码。使用Shapely用户手册中的“示例代码”,您可以快速创建具有相同友好风格的图像。

你需要'figures'模块,它只是一个简短的,非常简单的python文件,来自:https://github.com/Toblerity/Shapely/blob/main/docs/code/figures.py .(取自per https://gis.stackexchange.com/questions/362492/shapely-examples-use-figures-what-is-this-library

e5njpo68

e5njpo686#

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

t40tm48m

t40tm48m7#

我厌倦了Matplotlib的janky API来创建这些绘图图像,所以我创建了自己的库。Python模块称为WKTPlot,并使用Bokeh来绘制数据的交互式绘图。我有关于如何绘制WKT字符串数据以及Shapefile数据的示例。
它支持所有最有形状的几何类型:

  • 多点
  • LineString
  • MultiLineString
  • LinearRing
  • 多边形
  • 多重多边形
  • GeometryCollection
b5lpy0ml

b5lpy0ml8#

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

2ic8powd

2ic8powd9#

如果您使用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)

相关问题