我试图了解如何在D3中使用attrTween函数。 我正在尝试通过以下示例实现一个饼图:http://bl.ocks.org/mbostock/5100636。
但是,当我到达过渡部分时遇到了问题。
private populateGauge(): void {
const innerRadius = this.radius - 50;
const outerRadius = this.radius - 10;
const arc = d3
.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius)
.startAngle(0);
const background = this.svg
.append('path')
.datum({ endAngle: this.tau })
.style('fill', '#ddd')
.attr('d', arc);
this.myEndAngle = { endAngle: (this.gaugeData.value / 100) * this.tau };
const foreground = this.svg
.append('path')
.datum(this.myEndAngle)
.style('fill', 'orange')
.attr('d', arc);
foreground
.transition()
.duration(1500)
.attrTween('d', function(newAngle) {
return function(d) {
const interpolate = d3.interpolate(d.endAngle, newAngle);
return function(t) {
d.endAngle = interpolate(t);
return arc(d);
};
};
});
}
我一直试图使用简单的基本情况,并且仅在插值函数中使用0,但是我无法摆脱最后一个return语句引发的最终错误(return arc(d));
“数字”类型的参数不能分配给类型的参数 “ DefaultArcObject”。
如何解决这些问题? 让我知道是否需要提供更多信息。
答案 0 :(得分:2)
var process = require("child_process")
process.stdout.write(" Anything ")
采用单个函数,该函数返回另一个函数。您将其传递给一个函数,该函数以当前 datum , index 和当前 node 作为参数被调用。该函数应返回插值函数,该插值函数将使用 time 值调用。
当我查看您的源代码时。您有3个嵌套函数,这是不正确的。
您需要将开始和结束角度用作数据的值,并且不应该变异补间函数内部的 datum 。
我更喜欢在 tween 函数之外创建一个 arc 函数,然后将其用于我的插值。这样做会更有效,因为您不必每次都创建新的 arc 函数。
attrTween('d',...)
我发现使用节点包“ @ types / d3”更容易
const myArc = d3.arc();
// ^^^ call methods of arc() to configure settings that won't animate.
foreground
.transition()
.duration(1500)
.attrTween('d', (d) => {
return (t) => {
const angle = d3.interpolate(d.endAngle, d.newAngle)(t);
// ^^^ interpolate datum values using time.
myArc.startAngle(angle);
// ^^^ call methods of arc() to configure what you need.
return myArc(null);
// ^^^ call arc function to render "d" attribute.
};
};
});
然后您可以将这些类型导入TypeScript文件
npm install @types/d3 --save-dev
如果您具有WebStorm之类的IDE。您可以在D3函数上按CTRL + CLICK,然后查看类型定义和注释。