【问题标题】:Plotting disconnected entities with shapely descartes and matplotlib用匀称的笛卡尔和 matplotlib 绘制断开的实体
【发布时间】:2015-02-18 21:53:03
【问题描述】:

我需要绘制一个不连贯的圆圈列表,这些圆圈是我为其他目的而创建的。

我试图完全按照http://toblerity.org/shapely/manual.html#cascading-unions 中的示例进行操作(请参阅code),但这仅在圆圈重叠且整体连接时有效(在我的情况下不是这样)。如您所见,通过替换行

polygons = [Point(i, 0).buffer(0.7) for i in range(5)]

polygons = [Point(i, 0).buffer(0.7) for i in (0,4)]

这与AssertionError 中断,因为笛卡尔不是多边形的东西(或者如果将笛卡尔断言作为测试,matplotlib 失败 assert vertices.ndim == 2

查看matplotlib.path.Path 的文档似乎可以使用 MOVETO 来实现此目标,但 shapely 似乎不支持它。它是否正确?我有什么解决方法?

【问题讨论】:

  • 你不能把所有的圆一个接一个地画出来吗?
  • @DavidZwicker 这就是我现在正在做的事情,但并不令人满意,因为 i) 圈子太多 ii) 我不在乎每一个,但我关心被覆盖的区域,所以像 b) 这样匀称的例子的情节将是完美的

标签: python matplotlib shapely descartes


【解决方案1】:

以下代码有效:

from shapely.ops import cascaded_union
from shapely.geometry import Point
import random
from matplotlib.patches import Polygon
import pylab as pl
import numpy as np

circles = [Point(random.random(), random.random()).buffer(random.random() * 0.1) 
            for i in range(100)]

polygons = cascaded_union(circles)

fig, ax = pl.subplots(figsize=(8, 8))

for polygon in polygons:
    mpl_poly = Polygon(np.array(polygon.exterior), facecolor="g", lw=0, alpha=0.4)
    ax.add_patch(mpl_poly)

ax.relim()
ax.autoscale()

输出:

【讨论】:

  • 感谢您的回答。这提供了一些线索,它在您的示例中有效,但仍然晦涩难懂。特别是,如果/当有太多圈子可以连接图形时,for polygon in polygons: 会失败并显示TypeError: 'Polygon' object is not iterable。我想我可以检查多边形是否可迭代,并在它不是时使用 PolygonPatch 方法,但这看起来很丑。
猜你喜欢
  • 2019-12-29
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多