Javascript 带d3、js的圆环图中的arctween和数据集更改
点击一个按钮,我想将一个新的数据集添加到我的甜甜圈图表中,并让它转换到新的数据集。我写的代码有点像这样,但是当数据集中的单个数据的数量与前面的不同时,即从[1,2]到[1,2,3,4],就会遇到问题 我认为问题在于,每当新数据集有更多数据时,我需要创建一个新路径,而每当数据集有更少数据时,我需要删除路径。但是,当我尝试在单击函数中追加数据时,它将追加数据而不删除旧路径,并在图表上重叠 这是一个没有附加的版本,其中arctween可以工作,但是会有空的饼图弧,因为我不附加路径(arctween工作一半时间):Javascript 带d3、js的圆环图中的arctween和数据集更改,javascript,jquery,d3.js,Javascript,Jquery,D3.js,点击一个按钮,我想将一个新的数据集添加到我的甜甜圈图表中,并让它转换到新的数据集。我写的代码有点像这样,但是当数据集中的单个数据的数量与前面的不同时,即从[1,2]到[1,2,3,4],就会遇到问题 我认为问题在于,每当新数据集有更多数据时,我需要创建一个新路径,而每当数据集有更少数据时,我需要删除路径。但是,当我尝试在单击函数中追加数据时,它将追加数据而不删除旧路径,并在图表上重叠 这是一个没有附加的版本,其中arctween可以工作,但是会有空的饼图弧,因为我不附加路径(arctween工作
var pieW=500;
var pieH=500;
var innerRadius=100;
var outerRadius=200;
var results_pie=d3.layout.pie()
.sort(空);
var pie_arc=d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
var svg_pie=d3。选择(#pieTotal)
.attr(“宽度”,pieW)
.attr(“高度”,pieH)
.附加(“g”)
.attr(“转换”、“翻译”(“+pieW/2+”,“+pieH/2+”))
.attr(“类别”、“图表”);
var pie\u path=svg\u pie.selectAll(“path”).data(结果pie([1,2]))
.enter().append(“路径”)
.attr(“d”,扇形弧)
.每个功能(d){
这是。_电流=d;
})//存储初始值
.attr(“类别”、“投票权”)
.attr(“值”,函数(d,i){
回报(i-1);
});
var pie_投票=[1,2];
变量pie_colors=[“#0f0”,“#f00”];
$(svg_pie).bind(“监视器”,工作者);
$(svg_pie).trigger(“监视器”);
功能工作者(事件){
饼图路径=饼图路径数据(结果饼图(饼图投票))
.attr(“填充”,函数(d,i){
返回馅饼颜色[i];
});
pie_path.transition().duration(500).attrTween(“d”,arcTween).each('end',function(d){
如果(d.value您需要处理进入和退出选择以及更新选择。例如,请参阅。您案例中的相关代码为
pie_path = pie_path.data(results_pie(pie_votes));
pie_path.enter().append("path")
.attr("d", pie_arc)
.each(function (d) {
this._current = d;
}) // store the initial values
.attr("class", "vote_arc")
.attr("value", function (d, i) {
return (i - 1);
});
pie_path.exit().remove();
完整示例。谢谢。有没有方法在remove()之后执行回调?是否类似于remove(回调)?您想在回调中执行什么操作?.remove()
应该是最后一件事。基本上,我将饼图数据更改放在一个函数中,然后传入数据和颜色。我想让它以一种动画的方式,如果你要输入一组全新的数据(数据数组中的不同长度),它将通过首先将所有内容设置为0来处理它(因此就像arctween正在“清空”),删除数据,初始化新的数据集,然后设置新数据的动画。因此,这基本上需要调用上述代码的更改版本4次,以操纵饼图的移动。您可以设置.delay()
对于每个转换,它应该允许您做您想做的事情。您可以简单地延迟enter转换的开始,直到exit转换完成。延迟()是否相对于帧速率发生?似乎只是在特定的时间之后,因此较慢的系统可能会表现出奇怪的行为?
var pieW = 500;
var pieH = 500;
var innerRadius = 100;
var outerRadius = 200;
var results_pie = d3.layout.pie()
.sort(null);
var pie_arc = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
var svg_pie = d3.select("#pieTotal")
.attr("width", pieW)
.attr("height", pieH)
.append("g")
.attr("transform", "translate(" + pieW / 2 + "," + pieH / 2 + ")")
.attr("class", "piechart");
var pie_path = svg_pie.selectAll("path").data(results_pie([1, 2]))
.enter().append("path")
.attr("d", pie_arc)
.each(function (d) {
this._current = d;
}) // store the initial values
.attr("class", "vote_arc")
.attr("value", function (d, i) {
return (i - 1);
});
function arcTween(a) {
var i = d3.interpolate(this._current, a);
this._current = i(0);
return function (t) {
return pie_arc(i(t));
};
}
$('button').click(function () {
pie_votes = [];
pie_colors = [];
for (var i = 0; i < Math.floor(Math.random() * 10); i++) {
//sets new values on pie arcs
pie_votes.push(Math.floor(Math.random() * 10));
pie_colors.push("#" + (Math.floor(Math.random() * 16777215)).toString(16));
}
pie_path = pie_path.data(results_pie(pie_votes))
.enter().append("path")
.attr("d", pie_arc)
.each(function (d) {
this._current = d; }) // store the initial values
.attr("class", "vote_arc")
.attr("value", function (d, i) {
return (i - 1);
});
pie_path.attr("fill", function (d, i) {
return pie_colors[i]
});
pie_path.transition().duration(500).attrTween("d", arcTween).each('end', function (d) {
if (d.value <= 0) {
this.remove();
}
});
});
pie_path = pie_path.data(results_pie(pie_votes));
pie_path.enter().append("path")
.attr("d", pie_arc)
.each(function (d) {
this._current = d;
}) // store the initial values
.attr("class", "vote_arc")
.attr("value", function (d, i) {
return (i - 1);
});
pie_path.exit().remove();