D3.js d3可以在一个形状中构建形状吗?

D3.js d3可以在一个形状中构建形状吗?,d3.js,D3.js,我有个新问题。D3能画出这个吗 在d3中使用voronoi函数?我想的是一个svg,它的行为类似于一个循环,并将这里找到的voronoi绑定到一个循环。《纽约时报》使用flash实现了上述可视化。 有什么想法吗? 我已经尝试过创建一个大圆并嵌入较小的圆,但是voronoi没有出现,点也不局限于外圆。 生成的代码: <svg class="PiYG" width="560" height="570"> <circle cx="270" cy="300" r

我有个新问题。D3能画出这个吗 在d3中使用voronoi函数?我想的是一个svg,它的行为类似于一个循环,并将这里找到的voronoi绑定到一个循环。《纽约时报》使用flash实现了上述可视化。 有什么想法吗? 我已经尝试过创建一个大圆并嵌入较小的圆,但是voronoi没有出现,点也不局限于外圆。 生成的代码:

        <svg class="PiYG" width="560" height="570">
    <circle cx="270" cy="300" r="260" style="stroke: rgb(0, 0, 0);">
    <g>

非常感谢

不是真的,但不是因为d3的任何缺点,而是因为这不是Voronoi函数的功能。Voronoi函数根据图形中最接近给定点的区域构建直线。这不是一种按比例将圆划分为更小的段的方法,其大小与数据相对应

也就是说,创建一个循环Voronoi图是绝对可能的。为此,您必须对示例Voronoi图代码进行一些更改

首先,您必须确保所有的点都适合一个圆。在您的示例中,点位置由
d
给出,如下所示:

.attr("transform", function(d) { return "translate(" + d + ")"; })
要么
d
(您的数据集)需要适应这个循环,要么您需要对它进行一些转换。对于在两个维度中标准化为(-1,1)的数据,函数

.attr("transform", function(d) { return "translate([" +
    d[0]*Math.sqrt(1 - Math.pow(d[1],2)/2) 
    + "," +
    d[1]*Math.sqrt(1 - Math.pow(d[0],2)/2)
    + "])"; })
我会这样做的。在这里,我们创建了一个新数组,该数组将以
d
中原始数组的一个圆为边界


接下来,您需要将Voronoi图裁剪为包含在一个圆中。有趣的是,没有内置的“圆形”几何对象可供剪裁,因此您需要发挥创意!要么构建一种定制的方法来实现这一点,要么让Voronoi扩展到您的圈子之外,构建一个SVG来覆盖它。两者都可以。

我同意。我只是想看看我是否遗漏了什么,你所指的是voronoi树形图,这是对Michael Balzer和Oliver Deussen提出的标准矩形树形图的一个很好的改进。我目前正在研究如何使用d3实现这一点,所以如果你成功了,请分享:)你有没有想过这一点?如果是,您是否愿意共享您的解决方案代码?我正在尝试做一个类似的可视化,但在与d3进行争论以实现它时遇到了困难。
.attr("transform", function(d) { return "translate([" +
    d[0]*Math.sqrt(1 - Math.pow(d[1],2)/2) 
    + "," +
    d[1]*Math.sqrt(1 - Math.pow(d[0],2)/2)
    + "])"; })