注(因为我回答我的问题):如果你们当中有些人已经花了在这个问题上的时间,发现另一种解决办法,请张贴,我会接受你的回答。感谢@FernOfTheAndes参与寻找此解决方案的过程,因为它充满了使用svg弧的痛苦和苦恼。
下面是解的jsfiddle:
正如注释提到的,关键部分是产生的电弧作为纯香草SVG圆弧,不经由d3.svg.arc()。
定义弧的SVG规则很清晰,但有点难以管理。这里是an interactive explorer of svg syntax for arcs。
function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = (angleInDegrees-90) * Math.PI/180.0;
return {
x: centerX + (radius * Math.cos(angleInRadians)),
y: centerY + (radius * Math.sin(angleInRadians))
};
}
function describeArc(x, y, radius, startAngle, endAngle){
var start = polarToCartesian(x, y, radius, endAngle);
var end = polarToCartesian(x, y, radius, startAngle);
var arcSweep = endAngle - startAngle <= 180 ? "0" : "1";
var d = [
"M", start.x, start.y,
"A", radius, radius, 0, 1, 1, end.x, end.y
].join(" ");
return d;
}
这是实际直接生成曲面的标签代码:
而且,这两个功能在确定正确的弧线这个过程让我
var arcPaths = vis.append("g")
.style("fill","navy");
var labels = arcPaths.append("text")
.style("opacity", function(d) {
if (d.depth == 0) {
return 0.0;
}
if (!d.children) {
return 0.0;
}
var sumOfChildrenSizes = 0;
d.children.forEach(function(child){sumOfChildrenSizes += child.size;});
//alert(sumOfChildrenSizes);
if (sumOfChildrenSizes <= 5) {
return 0.0;
}
return 0.8;
})
.attr("font-size",10)
.style("text-anchor","middle")
.append("textPath")
.attr("xlink:href",function(d,i){return "#s"+i;})
.attr("startOffset",function(d,i){return "50%";})
.text(function(d){return d.name.toUpperCase();})
幸运的是,在中心文本弧线只是设置正确属性的问题。
一个快速提示:由于将cx和cy属性分配给var arc,所以抛出异常。如果你评论这两个标签,那么标签会显示在左上角(你提到的协调问题)。这可能是显而易见的,而且你已经从实验中知道了一些,但是想要指出它是一个理智检查。 – FernOfTheAndes
是的,这是一种“发展”的例子,所以这是正常的。 :)我知道所有捆绑在那个角落的文字。这实际上是我的问题 - 如何把它放在正确的地方。感谢您引起我的注意,现在其他人也会知道发生了什么...... :) – VividD
关于attr'startOffset =“”',[docs](http://www.w3.org/) TR/SVG11/text.html#TextPathElement)说:如果给出了除百分比之外的(这是您给出的百分比),那么'startOffset'表示沿当前用户坐标系中测量的路径的距离。在文档之后,然后在[沿着路径的距离](http://www.w3.org/TR/SVG11/paths.html#DistanceAlongAPath)上着陆。目前,这看起来像是textPath元素和指定x,y坐标的可能性之间的唯一连接。这里希望这不是一些兔子线索 –
FernOfTheAndes