2014-12-19 6 views
3

다른 목적을 위해 매끈하게 만든 분리 된 원의 목록을 그려야합니다. shapely descartes와 matplotlib로 단절된 실체를 그려야합니다

나는 http://toblerity.org/shapely/manual.html#cascading-unions 쇼 ( code 참조)의 예로서 정확하게하려고 노력했지만 그 원이 겹치는 경우에만 작동 전반적인 것은 (내 경우에는하지 않은) 연결되어 있습니다. 당신은 일이 데카르트 (하여 다각형 없었던

polygons = [Point(i, 0).buffer(0.7) for i in (0,4)] 
함께 나누기

AssertionError와 라인

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

를 대체하여 볼 수 있듯이 또는 하나는 데카르트의 주장을 주석 처리하면 assert vertices.ndim == 2 실패하기 matplotlib로 테스트로)

matplotlib.path.Path에 대한 문서를 보면 MOVETO를 사용하여이 목표를 달성 할 수 있지만 매끄럽게 지원하지는 않습니다. 이 올바른지? 어떤 해결 방법이 있습니까?

+0

방금 ​​모든 원을 잇달아 플롯되지 수 있습니까? –

+0

@DavidZwicker 그게 바로 지금하고있는 일입니다.하지만 i) 너무 많은 서클이 있고 ii) 나는 각각에 대해 신경 쓰지 않아요.하지만 나는 덮힌 지역에 관심이 있습니다. 그래서 b)와 같은 음모가 있습니다. 매끈한 예제가 완벽한 것입니다 – Davide

답변

4

다음 코드는 작동 :

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

출력 :

enter image description here

+0

답해 주셔서 감사합니다. 이것은 몇 가지 단서를 제공하고, 당신의 예제에서 작동하지만 여전히 애매합니다. 특히, 그림이 연결될 원이 너무 많으면 '다각형의 폴리곤 :'이 실패하고 'TypeError :'다각형 '객체가 반복 가능하지 않습니다.' 폴리곤이 반복 가능한지 검사 할 수 있고 그렇지 않을 때 PolygonPatch 접근법을 사용할 수 있다고 생각합니다.하지만 그렇게 추한 것 같습니다. – Davide