我一直在使用D3.js创建圆环图。我一直在关注HERE列出的例子。一切都很顺利,直到我到达关于从甜甜圈切片到文本标签的折线的部分。我已经完全复制了示例代码,而在他们的示例中,他们获得了很好的线条,我得到了如HERE所示的三角形。
所以,除了它不能正常工作之外,我必须承认我并不真正理解代码的折线部分。这使得我甚至不知道从哪里开始寻找问题的原因。下面是我项目中的折线绘图代码。任何帮助或见解都表示赞赏。
var polyline = chart.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();
修改
所以,按照惯例,一旦我放弃并提出这个问题,我发现了什么是错的。在我链接到的示例中,他们使用样式表将fill属性设置为none。虽然这有效但我宁愿留在D3代码中。对于任何感兴趣的人来说,这就是代码的样子。
var polyline = chart.select(".lines").selectAll("polyline")
.data(pie(data), key);
polyline.enter()
.append("polyline")
.style("fill", "none")
.style("stroke-width", "2px")
.style("stroke", "black")
.style("opacity", "0.4");
polyline.transition().duration(500)
.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();
答案 0 :(得分:0)
所以,按照惯例,一旦我放弃并提出这个问题,我发现了什么是错的。在我链接到的示例中,他们使用样式表将fill属性设置为none。虽然这有效但我宁愿留在D3代码中。对于任何感兴趣的人来说,这就是代码的样子。
var polyline = chart.select(".lines").selectAll("polyline")
.data(pie(data), key);
polyline.enter()
.append("polyline")
.style("fill", "none")
.style("stroke-width", "2px")
.style("stroke", "black")
.style("opacity", "0.4");
polyline.transition().duration(500)
.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();