gpt4 book ai didi

javascript - d3js 围绕饼图重新分配标签

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:50 24 4
gpt4 key购买 nike

我正在使用 d3.js 创建一个在外面带有标签的圆环图。我使用基于饼图每个切片的质心的三 Angular 函数来定位标签。

g.append("g")
.attr("class", "percentage")
.append("text")
.attr("transform", function(d)
{
var c = arc.centroid(d);
var x = c[0];
var y = c[1];
var h = Math.sqrt(x*x + y*y);
return "translate(" + (x/h * obj.labelRadius) + ',' + (y/h * obj.labelRadius) + ")";
}
)
.attr("dy", ".4em")
.attr("text-anchor", function(d)
{
return (d.endAngle + d.startAngle)/2 > Math.PI ? "end" : "start";
}
)
.text(function(d) { return d.data.percentage+"%"; });

我最终想要完成的是重新排列饼图边缘之外的标签,以防止重叠。

enter image description here

我尝试解决该问题的方法之一是定义一组“ anchor ”,标签可以放置在该位置,保证它们不会重叠。问题是将质心映射到 anchor 并保留切片和标签之间的某种视觉对应感(当切片很薄时特别困难)。

enter image description here

上图显示了 anchor 的可能位置(所示切片的质心)。这些位置不可能有重叠。

使问题更加复杂的是,当标签(它们是水平的)靠近饼图的顶部或底部时,它们比位于饼图右侧或左侧时更容易重叠。

关于如何解决这个问题有什么想法吗?

[编辑] 根据 meetamit 的建议,我实现了以下内容:

.attr("dy", function(d)
{
var c = arc.centroid(d);
var x = c[0];
var y = c[1];
var h = Math.sqrt(x*x + y*y);
var dy = y/h * obj.labelRadius;
dy=dy*fontSizeParam*.14/heightParam);
return (dy)+"em";
})

它有点帮助,并为标签留出一些空间,但仍在寻找一个涵盖所有情况的解决方案......

最佳答案

你不能创建两个弧吗?一个用于图表,一个用于标签?

// first arc used for drawing the pie chart
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);

// label attached to first arc
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.age; });

// second arc for labels
var arc2 = d3.svg.arc()
.outerRadius(radius + 20)
.innerRadius(radius + 20);

// label attached to second arc
g.append("text")
.attr("transform", function(d) { return "translate(" + arc2.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.age; });

关于javascript - d3js 围绕饼图重新分配标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155194/

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