gpt4 book ai didi

javascript - 制作 D3 Pie v4 示例 - 在初始渲染时设置动画

转载 作者:行者123 更新时间:2023-11-30 20:47:19 25 4
gpt4 key购买 nike

我的工作起点是:http://bl.ocks.org/dbuezas/9306799我无法弄清楚的一件事是为什么它一开始没有动画。我可以做一个简单的改变来使这个动画最初吗?

通常我将属性设置为零,但我不知道如何让 attrTween 开始动画。

有什么建议吗?

如果方便的话添加为一个片段..

var svg = d3.select("body")
.append("svg")
.append("g")

svg.append("g")
.attr("class", "slices");
svg.append("g")
.attr("class", "labels");
svg.append("g")
.attr("class", "lines");

var width = 500,
height = 200,
radius = Math.min(width, height) / 2;

var pie = d3.layout.pie()
.sort(null)
.value(function(d) {
return d.value;
});

var arc = d3.svg.arc()
.outerRadius(radius * 0.8)
.innerRadius(radius * 0.4);

var outerArc = d3.svg.arc()
.innerRadius(radius * 0.9)
.outerRadius(radius * 0.9);

svg.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

var key = function(d){ return d.data.label; };

var color = d3.scale.ordinal()
.domain(["Lorem ipsum", "dolor sit", "amet", "consectetur", "adipisicing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt"])
.range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

function randomData (){
var labels = color.domain();
return labels.map(function(label){
return { label: label, value: Math.random() }
});
}

change(randomData());

d3.select(".randomize")
.on("click", function(){
change(randomData());
});


function change(data) {

/* ------- PIE SLICES -------*/
var slice = svg.select(".slices").selectAll("path.slice")
.data(pie(data), key);

slice.enter()
.insert("path")
.style("fill", function(d) { return color(d.data.label); })
.attr("class", "slice");

slice
.transition().duration(1000)
.attrTween("d", function(d) {
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
return arc(interpolate(t));
};
})

slice.exit()
.remove();

/* ------- TEXT LABELS -------*/

var text = svg.select(".labels").selectAll("text")
.data(pie(data), key);

text.enter()
.append("text")
.attr("dy", ".35em")
.text(function(d) {
return d.data.label;
});

function midAngle(d){
return d.startAngle + (d.endAngle - d.startAngle)/2;
}

text.transition().duration(1000)
.attrTween("transform", function(d) {
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
var d2 = interpolate(t);
var pos = outerArc.centroid(d2);
pos[0] = radius * (midAngle(d2) < Math.PI ? 1 : -1);
return "translate("+ pos +")";
};
})
.styleTween("text-anchor", function(d){
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
var d2 = interpolate(t);
return midAngle(d2) < Math.PI ? "start":"end";
};
});

text.exit()
.remove();

/* ------- SLICE TO TEXT POLYLINES -------*/

var polyline = svg.select(".lines").selectAll("polyline")
.data(pie(data), key);

polyline.enter()
.append("polyline");

polyline.transition().duration(1000)
.attrTween("points", function(d){
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
var d2 = interpolate(t);
var pos = outerArc.centroid(d2);
pos[0] = radius * 0.95 * (midAngle(d2) < Math.PI ? 1 : -1);
return [arc.centroid(d2), outerArc.centroid(d2), pos];
};
});

polyline.exit()
.remove();
};
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
width: 400px;
height: 400px;
position: relative;
}

svg {
width: 100%;
height: 100%;
}

path.slice{
stroke-width:2px;
}

polyline{
opacity: .3;
stroke: black;
stroke-width: 2px;
fill: none;
}
<!DOCTYPE html>
<meta charset="utf-8">

</style>
<body>
<button class="randomize">randomize</button>

<script src="http://d3js.org/d3.v3.min.js"></script>

</body>

最佳答案

问题是您需要为楔形设置与其最终状态不同的初始状态,以便查看过渡。

在图表的初始加载时,检查是否定义了 this._current,如果没有,则为其分配一些初始数据:

  if(!this._current) this._current = startSlice; // assign initial data
else this._current = this._current || d; // otherwise, continue as before.

startSlice 可能看起来像:

var startSlice = {
startAngle: 0,
endAngle: 0,
padAngle:0,
value:0,
data: {lable:"",value:0}
}

或者您需要它来满足您的需要。我只更新了下面动画中的楔形部分:

var svg = d3.select("body")
.append("svg")
.append("g")

svg.append("g")
.attr("class", "slices");
svg.append("g")
.attr("class", "labels");
svg.append("g")
.attr("class", "lines");

var width = 500,
height = 200,
radius = Math.min(width, height) / 2;

var pie = d3.layout.pie()
.sort(null)
.value(function(d) {
return d.value;
});

var arc = d3.svg.arc()
.outerRadius(radius * 0.8)
.innerRadius(radius * 0.4);

var outerArc = d3.svg.arc()
.innerRadius(radius * 0.9)
.outerRadius(radius * 0.9);

svg.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

var key = function(d){ return d.data.label; };

var color = d3.scale.ordinal()
.domain(["Lorem ipsum", "dolor sit", "amet", "consectetur", "adipisicing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt"])
.range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

function randomData (){
var labels = color.domain();
return labels.map(function(label){
return { label: label, value: Math.random() }
});
}

change(randomData());

d3.select(".randomize")
.on("click", function(){
change(randomData());
});


function change(data) {

/* ------- PIE SLICES -------*/

var startSlice = {
startAngle: 0,
endAngle: 0,
padAngle:0,
value:0,
data: {lable:"",value:0}
}

var slice = svg.select(".slices").selectAll("path.slice")
.data(pie(data), key);

slice.enter()
.insert("path")
.style("fill", function(d) { return color(d.data.label); })
.attr("class", "slice");

slice
.transition().duration(1000)
.attrTween("d", function(d) {
if(!this._current) this._current = startSlice;
else this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
return arc(interpolate(t));
};
})

slice.exit()
.remove();

/* ------- TEXT LABELS -------*/

var text = svg.select(".labels").selectAll("text")
.data(pie(data), key);

text.enter()
.append("text")
.attr("dy", ".35em")
.text(function(d) {
return d.data.label;
});

function midAngle(d){
return d.startAngle + (d.endAngle - d.startAngle)/2;
}

text.transition().duration(1000)
.attrTween("transform", function(d) {
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
var d2 = interpolate(t);
var pos = outerArc.centroid(d2);
pos[0] = radius * (midAngle(d2) < Math.PI ? 1 : -1);
return "translate("+ pos +")";
};
})
.styleTween("text-anchor", function(d){
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
var d2 = interpolate(t);
return midAngle(d2) < Math.PI ? "start":"end";
};
});

text.exit()
.remove();

/* ------- SLICE TO TEXT POLYLINES -------*/

var polyline = svg.select(".lines").selectAll("polyline")
.data(pie(data), key);

polyline.enter()
.append("polyline");

polyline.transition().duration(1000)
.attrTween("points", function(d){
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
var d2 = interpolate(t);
var pos = outerArc.centroid(d2);
pos[0] = radius * 0.95 * (midAngle(d2) < Math.PI ? 1 : -1);
return [arc.centroid(d2), outerArc.centroid(d2), pos];
};
});

polyline.exit()
.remove();
};
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
width: 400px;
height: 400px;
position: relative;
}

svg {
width: 100%;
height: 100%;
}

path.slice{
stroke-width:2px;
}

polyline{
opacity: .3;
stroke: black;
stroke-width: 2px;
fill: none;
}
<!DOCTYPE html>
<meta charset="utf-8">

</style>
<body>
<button class="randomize">randomize</button>

<script src="http://d3js.org/d3.v3.min.js"></script>

</body>

关于javascript - 制作 D3 Pie v4 示例 - 在初始渲染时设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com