2012-01-19 146 views
0

我正在从GIS数据库读取数据,并使用mpl_toolkits.basemap和matplotlib创建地图。一些数据创建复杂的多边形(由外部和内部环定义)。但是,我一直无法找到如何创建带孔的多边形。这甚至可能与matplotlib?是否有另一种方法来创建这个图像?如何绘制复杂的多边形?

回答

1

老问题,但...

就明确地关闭您的内部和外部边界和它们一起求和。从技术上讲,会有一个接缝,但你不会看到它(如果你提供了一个颜色参数 - 不完全确定为什么这样)。

#!/usr/bin/env python3 

import matplotlib.pyplot as plt 

# a 4x4 box (counterclockwise) 
ext_x = [2, -2, -2, 2, 2] 
ext_y = [2, 2, -2, -2, 2] 

# a 2x2 hole in the box (clockwise) 
int_x = [item/2.0 for item in ext_x][::-1] 
int_y = [item/2.0 for item in ext_y][::-1] 

# if you don't specify a color, you will see a seam 
plt.fill(ext_x+int_x, ext_y+int_y, color='blue') 

plt.show() 
0

fill_between()怎么样?

http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.fill_between

我不知道究竟是如何拉过一个多边形,但它的工作原理是这样

import numpy as np 
import matplotlib.pylab as plt 

x=np.arange(-3,3.5,.5) 
y1=-x**2+9 
y2=-x**2+10 
plt.fill_between(x,y1,y2) 

results

您应该能够建立你的身材一个fill_between一次直到你有你想要的。

或可能的path。看看这些screenshots,看看有没有什么东西似乎接近。

编辑:您可能意味着一个孔这样

import numpy as np 
import matplotlib.pylab as plt 

x=np.arange(-3,3.5,.5) 
y1=-x**2+9 
y2=0 
plt.fill_between(x,y1,y2) 
circ=plt.Circle((0,4),2,color='w') 
ax=plt.gca() 
ax.add_patch(circ) 
plt.show() 

enter image description here

+1

这绝对会创建一个多边形,但不是一个带有洞的多边形。 –

+0

我不认为我理解“洞”。我以为你的意思是空洞的。正如我想象的那样,洞的大小将取决于y2与y1的关系。 – Matt

4

实际上,您可以在matplotlib中绘制带有孔的多边形。诀窍是使用Path和PathPatch。例如:

import matplotlib.pyplot as plt 
from matplotlib.patches import PathPatch 
from matplotlib.path import Path 

axes = plt.gca() 

path = Path([(2,2)  ,(2,-2)  ,(-2,-2) ,(-2,2)  ,(0,0)   ,(1,0)  ,(-1,1)  ,(-1,-1) ,(0,0)   ], 
      [Path.MOVETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.CLOSEPOLY,Path.MOVETO,Path.LINETO,Path.LINETO,Path.CLOSEPOLY]) 
patch = PathPatch(path) 
axes.set_xlim(-3,3) 
axes.set_ylim(-3,3) 
axes.add_patch(patch) 

plt.savefig('example.png') 
plt.close('all') 

this example上述结果(不能发布图像尚未)。 请注意,缠绕顺序似乎很重要。