我花了很多时间试图从scipy.spatial.Voronoi图中获取边缘无济于事.以下是主要文档:http: //docs.scipy.org/doc/scipy-dev/reference/generated/scipy.spatial.Voronoi.html
如果你像这样创建一个Voronoi图:
points = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2],
[2, 0], [2, 1], [2, 2]]) //Or feel free to use any set of points
Run Code Online (Sandbox Code Playgroud)
然后您可以访问以下对象属性:
vor.regions
vor.max_bound
vor.ndim
vor.ridge_dict
vor.ridge_points
vor.ridge_vertices
vor.npoints
vor.point_region
vor.points
Run Code Online (Sandbox Code Playgroud)
但目前还不清楚如何组合这些以获得2d voronoi图形式(point1,point2)的边缘?我知道边缘存在是因为您可以绘制voronoi图及其edgres和顶点,因为您可以执行以下操作:
voronoi_plot_2d(vor)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这清楚地描绘了voronoi edgres - 如何获得它们的列表及其起点和终点?没关系,如果我只获得坚实的边缘(不是虚线的那些无限制的情节)
我正在尝试用2D中的曼哈顿距离计算Voronoi tesselation R.
理想情况下,这将是一个函数,它采用一组二维点并输出一个分隔空间的多边形列表.我不确定Voronoi tesselations的标志是什么.
当然也有很多方法可以做到这与欧几里德度量(包像deldir和qhull使这很容易),但我还没有找到一种方法,为曼哈顿距离做到这一点.使用sos's 的搜索findFn('voronoi')也没有产生任何结果.
我正在使用scipy.spatialVoronoi 图的可视化。然而,这里使用的距离度量是欧几里德(L2)。我正在寻找一种在我的 Voronoi 图上进行曼哈顿 (L1) 度量的方法。有没有一种简单的(或多或少)方法可以做到这一点?
import numpy as np
import matplotlib.pyplot as plt
points = np.array([[1.5, 1.], [3.5, 1.], [5., 2.], [2.5, 3.], [3.5, 1.], [4., 4.]])
from scipy.spatial import Voronoi, voronoi_plot_2d
vor = Voronoi(points)
fig = plt.figure()
ax = fig.add_subplot('111')
ax.plot(points[:, 0], points[:, 1], 'o', color='k')
ax.set_xlim([-1, 9])
ax.set_ylim([-1, 9])
voronoi_plot_2d(vor, ax)
Run Code Online (Sandbox Code Playgroud)
基本上我想要得到类似的东西,但采用 L1 度量。
我发现scipy.spatial.distance.cityblock可以处理感兴趣的指标,但不完全确定如何实现它才能正常工作?
区域的颜色并不重要,我想要实现的是沿着 Voronoi 区域的边缘的可变“厚度”(特别是,它们看起来像一个更大的圆形斑点,在拐角处相交,在拐角处相交处更薄)他们的中间点)。
我尝试根据到每个质心的最小距离“手动绘制”每个像素(每个像素与一种颜色相关联):
n_centroids = 10
centroids = [(random.randint(0, h), random.randint(0, w)) for _ in range(n_centroids)]
colors = np.array([np.random.choice(range(256), size=3) for _ in range(n_centroids)]) / 255
for x, y in it.product(range(h), range(w)):
distances = np.sqrt([(x - c[0])**2 + (y - c[1])**2 for c in centroids])
centroid_i = np.argmin(distances)
img[x, y] = colors[centroid_i]
plt.imshow(img, cmap='gray')
Run Code Online (Sandbox Code Playgroud)
或者通过scipy.spatial.Voronoi,这也给了我顶点,尽管我仍然不知道如何以所需的可变厚度通过它们画一条线。
from scipy.spatial import Voronoi, voronoi_plot_2d
# make up data points
points = [(random.randint(0, 10), random.randint(0, 10)) for _ in range(10)]
# …Run Code Online (Sandbox Code Playgroud) 如何使用 Qhull 确定哪些 voronoi 单元(按索引)是“正确的”(由“现有顶点”组成)
我正在尝试使用 LLoyds 算法和由 scipy.spatial Voronoi(它是 Qhull 的包装器)生成的输入来执行约束松弛。
在代码方面,它看起来像:
points = [n for n in itertools.product(xrange(3),xrange(3))]
vor = Voronoi(points)
vor2 = lloyd(vor) # my relaxation function - not relevant to the question
Run Code Online (Sandbox Code Playgroud)
代码生成的输出图看起来不错(见下文),但 vor 结构中的数据不足以执行劳埃德松弛。这是因为我应该只移动有效 voronoi 单元格内的点(图像中的 #4)。另一个应该保持原样。Qhull 弄乱了点/区域的顺序,所以我无法估计哪个区域属于哪个点。
这是问题的说明:
print vor.vertices
#[[ 0.5 0.5]
# [ 1.5 0.5]
# [ 0.5 1.5]
# [ 1.5 1.5]]
print vor.regions
# [[], [-1, 0], [-1, 1], [1, -1, 0], [3, -1, 2], [-1, 3], [-1, 2], [3, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 scipy 的 Voronoi 镶嵌
http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.spatial.Voronoi.html
但python不会导入它
from scipy.spatial import Voronoi
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name Voronoi
Run Code Online (Sandbox Code Playgroud)
但是,我从 scipy.spatial 导入其他类没有问题
from scipy.spatial import Delaunay
Run Code Online (Sandbox Code Playgroud) 我正在使用Fortune算法的Javascript实现来计算voronoi单元格(https://github.com/gorhill/Javascript-Voronoi).我要计算的网站是地图上的点(所以(lat,lng)).我首先做了投影(lat,lng) -> (x,y),然后我计算了voronoi单元格,并以另一种方式进行了半边投影.
它工作正常,我使用传单显示结果,但我需要做一件事.
我最初计算的每个站点都取决于ID,我按ID重新分类voronoi单元格,最后,对于每个具有标准数据结构的ID,如下所示:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[
[9.994812, 53.549487],
[10.046997, 53.598209],
[10.117721, 53.531737],
[9.994812, 53.549487]
]]
}
}, {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[
[10.000991, 53.50418],
[10.03807, 53.562539],
[9.926834, 53.551731],
[10.000991, 53.50418]
]]
}
}
]
};
Run Code Online (Sandbox Code Playgroud)
给定ID的一组多边形(由voronoi单元格的一半边缘构成).
我需要通过ID合并这些多边形,我打算使用turf.merge(),但我有拓扑错误
turf.min.js:13 Uncaught TopologyError: side location conflict
Run Code Online (Sandbox Code Playgroud)
根据这篇文章(http://lists.refractions.net/pipermail/jts-devel/2009-March/002939.html),我试图将(lat,lng)这对夫妇从10 ^ -14 圈到10 ^ -7但是它没有真正奏效.在寻找扭结并尝试删除它们之前,我打印了一些数据样本,我知道问自己是否使用了Fortune算法中的好数据.当我显示所有ID的所有多边形时,我有正确的图表,但是当我显示一个ID的所有多边形或一个ID的一些多边形时,我最终会得到不完整的图表:
完整图表的一部分
一个ID的部分图表 …
我有两组点,plot它们分别是蓝星和红点。然后我plot用voronoi(X,Y)函数的两个集合的 Voronoi 图。我想指定每个单元格的颜色取决于它的站点属于哪个集合。我几乎通过patch这种方式使用函数来完成这个:
[v,c]=voronoin(D);
for p=1:TheNumberOfSets
r=rand()/2+0.5; % random gray color
col=[r r r];
for s=1:PointsInSet(p)
l=l+1;
patch(v(c{l},1),v(c{l},2),col); % color
axis([0 10 0 10]);
end
end
Run Code Online (Sandbox Code Playgroud)
D集合点的坐标在哪里,TheNumberOfSets显示我们有多少个集合(在这个特定的部分我们只有 2 个集合),col指定一个随机的灰色,PointsInSet指定我们在每个集合中有多少个点,l用于枚举Voronoi 图的单元格。
现在我的问题(如你所见!)是关于无界细胞。此代码只是更改有界单元格的颜色,我想在轴框范围内(即您可以在图像中看到的框)使用其指定集的颜色为无界单元格着色。
有什么建议吗?
所以我使用了 voronoi_plot_2d() 函数,它是 SciPy 的一部分,当我绘制我的图表时,我得到了下面的图表,其中一些在集群之间有实心边界,有些有虚线边界。(隐藏每个聚类的散点图)
它们背后有不同的含义吗?如果它们是同一件事,例如,我如何指定我只想绘制实心边框?文档(http://scipy.github.io/devdocs/generated/scipy.spatial.voronoi_plot_2d.html)没有提及任何内容。
另外,我收到以下警告
MatplotlibDeprecationWarning: The ishold function was deprecated in version 2.0.
MatplotlibDeprecationWarning: axes.hold is deprecated.
Run Code Online (Sandbox Code Playgroud)
当我使用 voronoi_plot_2d() 函数时。我正在运行 Python 3.5,有没有办法让警告消失?我在我的代码中既没有使用 ishold 函数也没有使用axes.hold,所以警告一定来自 voronoi_plot_2d() 内部。
我使用voronoinMATLAB来判断单元格之间的连接,我想把这个函数转换成Python。
当我使用scipy.spatial.VoronoiPython 时,输出有点不同。例如,我对 MATLAB 和 Python 使用了相同的输入,您可以在下一个代码中看到。
MATLAB:
seed = [ 17.746 -0.37283 -0.75523;
6.1704 1.3404 7.0341;
-7.7211 5.4282 4.5016;
5.8014 2.1252 -6.2491;
-16.047 -2.8472 -0.024795;
-2.2967 -6.7334 0.60707]
[vvern_mat, vceln_mat] = voronoin(seed);
Run Code Online (Sandbox Code Playgroud)
Python:
import numpy as np
from scipy.spatial import Voronoi
seed = np.array([[ 17.746 , -0.37283 , -0.75523 ],
[ 6.1704 , 1.3404 , 7.0341 ],
[ -7.7211 , 5.4282 , 4.5016 ],
[ 5.8014 , 2.1252 , -6.2491 ],
[-16.047 , -2.8472 , …Run Code Online (Sandbox Code Playgroud)