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.GeoSeries的文档
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)
如果您使用的是 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)
如果您的数据在.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)