D3与Scipy(Voronoi图实现)

2024-09-30 20:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我正在处理一组包含在csv文件中的8000个地理点。一方面,我创建了一个用这些点构建的Voronoi图的可视化-这是用D3库完成的。另一方面,我使用Scipy在Python中计算这些Voronoi图。在

我的工作逻辑很简单——我在Python方面处理数据,制作热图、分析等等,然后用D3可视化效果。但今天我无意中发现,夏比和D3绘制的沃罗诺图是不同的。我注意到在使用地理JSON.io绘制用Python制作的Voronois的GeoJsons,看看我是否能把那里的一切都可视化。在

正如我所说,Voronois是不同的-有些有不同的角度,有些甚至有额外的顶点。在

问题:

为什么会这样?这两个库(D3和Scipy)计算的Voronoi图为什么不同?在

进一步说明

如何在D3侧实现这一点:基于chriszetter的示例http://chriszetter.com/blog/2014/06/15/building-a-voronoi-map-with-d3-and-leaflet/我将纬度和经度转换为自定义投影,以便在mapbox地图上可视化。在

var voronoi = d3.geom.voronoi()
.x(function(d) { return d.x; })
.y(function(d) { return d.y; })
.clipExtent([[N_W.x , N_W.y],[S_E.x, S_E.y]])

我创建Voronoi基于在地图边界内可见的点+一些填充(filteredPoints)

^{pr2}$

如何在Python端实现:我使用scipy.spatial.Voronoi公司. 在

from scipy.spatial import Voronoi

def create_voronois():
    points = numpy.array(points_list)
    vor = Voronoi(points)

其中“points_list”是我的8000个地理点的列表。在

编辑:

从我的视觉化截图-黑色边框是沃罗诺斯与D3,白色的是由scipy.spatial.Voronoi公司. 我们可以看出,西皮是错的。以前有人比较过这两个库吗?在

http://imgur.com/b1ndx0F

要运行的代码。它用计算错误的Voronois打印GeoJson。在

import numpy
from scipy.spatial import Voronoi
from geojson import FeatureCollection, Feature, Polygon

points = [
[22.7433333333000,  53.4869444444000],
[23.2530555556000,  53.5683333333000],
[23.1066666667000,  53.7200000000000],
[22.8452777778000,  53.7758333333000],
[23.0952777778000,  53.4413888889000],
[23.4152777778000,  53.5233333333000],
[22.9175000000000,  53.5322222222000],
[22.7197222222000   ,53.7322222222000],
[22.9586111111000,  53.4594444444000],
[23.3425000000000,  53.6541666667000],
[23.0900000000000,  53.5777777778000],
[23.2283333333000,  53.4713888889000],
[23.3488888889000,  53.5072222222000],
[23.3647222222000   ,53.6447222222000]]

def create_voronois(points_list):
    points = numpy.array(points_list)
    vor = Voronoi(points)
    point_voronoi_list = []
    feature_list = []
    for region in range(len(vor.regions) - 1):
        vertice_list = []
        for x in vor.regions[region]:
            vertice = vor.vertices[x]
            vertice = (vertice[1], vertice[0])
            vertice_list.append(vertice)
            polygon = Polygon([vertice_list])
            feature = Feature(geometry=polygon, properties={})
            feature_list.append(feature)

    feature_collection = FeatureCollection(feature_list)
    print feature_collection

create_voronois(points)

Tags: fromimport可视化scipy地理spatialfeaturepoints
1条回答
网友
1楼 · 发布于 2024-09-30 20:27:57

显然,在计算Voronoi图之前,javascript代码正在对数据进行转换。此转换不会保留点的相对距离,因此不会生成与scipy代码相同的结果。注意,我并不是说你的d3版本不正确。假设数据是经纬度,那么您在javascript代码中所做的可能是正确的。但要将其与scipy代码进行比较,如果希望得到相同的Voronoi图,则必须执行相同的转换。在

下面的脚本显示,如果保留输入点的相对距离,scipy的Voronoi函数和d3。沃罗诺几何生成相同的图表。在

下面是一个使用scipy的Voronoi代码的脚本:

import numpy
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt


points = [
[22.7433333333000,  53.4869444444000],
[23.2530555556000,  53.5683333333000],
[23.1066666667000,  53.7200000000000],
[22.8452777778000,  53.7758333333000],
[23.0952777778000,  53.4413888889000],
[23.4152777778000,  53.5233333333000],
[22.9175000000000,  53.5322222222000],
[22.7197222222000,  53.7322222222000],
[22.9586111111000,  53.4594444444000],
[23.3425000000000,  53.6541666667000],
[23.0900000000000,  53.5777777778000],
[23.2283333333000,  53.4713888889000],
[23.3488888889000,  53.5072222222000],
[23.3647222222000,  53.6447222222000]]


vor = Voronoi(points)

voronoi_plot_2d(vor)
plt.axis('equal')
plt.xlim(22.65, 23.50)
plt.ylim(53.35, 53.85)
plt.show()

它生成以下绘图:

plot

下面是一个使用d3的javascript程序。沃罗诺几何公司名称:

^{pr2}$

它产生:

voronoi screenshot

基于对结果的目视检查,我认为他们正在生成相同的Voronoi图。在

相关问题 更多 >