【发布时间】:2016-06-03 14:57:48
【问题描述】:
从一个复杂的 3D 形状中,我通过 tricontourf 获得了与我的形状等效的 top view。
我现在希望将此结果导出到二维数组。 我试过这个:
import numpy as np
from shapely.geometry import Polygon
import skimage.draw as skdraw
import matplotlib.pyplot as plt
x = [...]
y = [...]
z = [...]
levels = [....]
cs = plt.tricontourf(x, y, triangles, z, levels=levels)
image = np.zeros((100,100))
for i in range(len(cs.collections)):
p = cs.collections[i].get_paths()[0]
v = p.vertices
x = v[:,0]
y = v[:,1]
z = cs.levels[i]
# to see polygon at level i
poly = Polygon([(i[0], i[1]) for i in zip(x,y)])
x1, y1 = poly.exterior.xy
plt.plot(x1,y1)
plt.show()
rr, cc = skdraw.polygon(x, y)
image[rr, cc] = z
plt.imshow(image)
plt.show()
但不幸的是,从轮廓顶点仅按级别创建一个多边形(我认为),在我的 2D 数组中轮廓的末尾 an incorrect projection 生成。
您是否有在二维数组中正确表示轮廓的想法?
【问题讨论】:
-
您想将轮廓表示为矩形数组中的数字吗?将 NaN 分配给您所在区域以外的值?
-
如果我没记错的话,
cs.collections[i].get_paths()返回一个对应于级别i的轮廓线段的列表。这与您仅引用...get_paths()[0]一致。您可能必须循环for path in ...get_paths()并独立绘制每条路径。但请注意:可能存在开放的等高线,因此像这样使用Polygon可能不正确(这可能会解释图中的虚假线)。我建议使用带有简单轮廓线的简单示例函数来了解这些事情是如何在幕后完成的。 -
@nicoguaro :我无法在我的区域之外分配价值,因为我不知道先验。
-
@Andreas : 越来越好(见下文)
标签: python matplotlib contourf