我是一个 D3 菜鸟,试图找出转换并希望使用多个数据集。我查看了其他问题,但没有找到使用两个数据集的答案。这个jsfiddle显示了我正在尝试做的事情。我正在构建一个应用程序来帮助入门统计学生抽取随机样本。他们将设置概率——圆环图的一部分——并选择要抽样的抽奖次数。然后甜甜圈转动,样品弹出一个圆圈。
两个数据集:一个(pieData)保存圆环图的值和标签。
另一个(drawData)从 360 到 720 的随机值。最终两者都将在 R 中生成并使用 RJSONIO 和闪亮传递到 D3。(那部分有效,jsfiddle显示了问题)
我已经将甜甜圈定义为基于数据集 pieData 的弧,我将其作为 g.slices 附加到我的 svg 对象。我添加了圆圈,并给了它们 drawData 来识别它们的颜色。
甜甜圈上的旋转动画需要drawData。我的 jsfiddle 用 for 循环笨拙地做到了,但我只能看到最后一次绘制的角度(五次),而不是每次看到五个不同的角度。
我缺乏对几个关键点的理解:我在循环中定义了一个函数,我知道这是一个禁忌。这是我对绘制次数的循环,它使甜甜圈旋转正确的次数,但总是以相同的角度(最后一个)。
for (var i = 0; i < nDraws; i++) {
ndx = i
arcs.transition()
.delay((slideDuration + spinDuration) * ndx)
.duration(spinDuration)
.ease("cubic-out")
.attrTween("transform", function () {
return d3.interpolateString("rotate( 0, 0, 0)",
"rotate(" + spinAngle[ndx] + ", 0, 0)");
});
}
我创建了另一个计数器以在我的函数中使用,因为“i”没有通过。这是我在圈子上的过渡,效果很好:
circles.each(function(d,i){
var ndx = i ;
d3.select(this).transition()
// toss out the circle
.delay(spinDuration + (slideDuration + spinDuration) * ndx )
.duration( slideDuration )
.ease("linear")
.attr("cx", function(d,i) { return ndx * spacing - w /2 ; })
.attr("cy", 135)
.attr("r", 20);
});
我错过了如何很好地构建程序的要点。我找到的最接近示例的是链式转换,从中我了解到圆和弧都需要属于一个共同的父级,我应该将两个转换应用于父级。
对于这些问题,我们将不胜感激:
1)我可以合并我的两个数据集(不同的列和不同的行数吗?
2)我将如何构建一个包含甜甜圈和采样圆圈的父级,以及如何为它提供两个数据集?
3) 功能并不像我希望的那样为我工作。我想我正在尝试返回对象,但 d3 希望返回是函数(?)
非常感谢您提供学习如何将所有部分组合在一起的地方。D3的情节很精彩。
吉姆RC