Javascript 如何在D3饼图中动态放置标签

Javascript 如何在D3饼图中动态放置标签,javascript,d3.js,pie-chart,Javascript,D3.js,Pie Chart,我在我的应用程序中使用D3JS,我的应用程序中有一个饼图。通过在互联网和一些论坛上的搜索,我找到了一种在饼图外部显示饼图标签的方法(之前它们显示在饼图内部)。但是,即使我现在把标签放在了馅饼外面,当标签名很长时,它有时会与馅饼重叠。当饼图切片变小时,名称也会相互重叠。有没有一种方法可以让这些标签在不重叠的情况下动态显示 下面是我使用的示例代码 var data2018 = [{ "label": "Argentina", "value": 2 }, { "

我在我的应用程序中使用D3JS,我的应用程序中有一个饼图。通过在互联网和一些论坛上的搜索,我找到了一种在饼图外部显示饼图标签的方法(之前它们显示在饼图内部)。但是,即使我现在把标签放在了馅饼外面,当标签名很长时,它有时会与馅饼重叠。当饼图切片变小时,名称也会相互重叠。有没有一种方法可以让这些标签在不重叠的情况下动态显示

下面是我使用的示例代码

    var data2018 = [{
    "label": "Argentina",
    "value": 2
  },
  {
    "label": "Madagascar",
    "value": 10
  },
  {
    "label": "Sri Lanka",
    "value": 15
  },
  {
    "label": "United States of America",
    "value": 13
  },
  {
    "label": "Iceland",
    "value": 17
  },
  {
    "label": "Australia",
    "value": 23
  },
  {
    "label": "Bulgeria",
    "value": 7
  },
  {
    "label": "Saudi Arabia",
    "value": 8
  },
  {
    "label": "United Arab Emirates",
    "value": 5
  }
];



  var data = data2018;


const margin = 80;
const w = 1000 - 2 * margin;
const h = 550 - 2 * margin;
var r = h / 2;
var color = d3.scale.category20c();

d3.selectAll("#container-pie > *").remove();

var vis = d3.select('#container-pie').append('g').append('svg:svg').data([data]).attr("width", w).attr("height", h).append("svg:g").attr('x', 10).attr('y', 20)
  .attr("transform", "translate(" + w / 2 + "," + 1.2 * r + ")");

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

// declare an arc generator function
var arc = d3.svg.arc().outerRadius(r);

var arcOver = d3.svg.arc()
  .outerRadius(r + 30);


// select paths, use arc generator to draw
var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice");
arcs.append("svg:path")
  .attr("fill", function(d, i) {
    return color(i);
  })
  .attr("d", function(d) {
    // log the result of the arc generator to show how cool it is :)
    console.log(arc(d));
    return arc(d);
  })
  .on("mouseenter", function(d) {
    d3.select(this)
      .attr("stroke", "white")
      .transition()
      .duration(1000)
      .attr("d", arcOver)
    // .attr("stroke-width",6);
  })
  .on("mouseleave", function(d) {
    d3.select(this).transition()
      .attr("d", arc)
      .attr("stroke", "none");
  })
  .on("click", function(d) {});

// add the text
//             arcs.append("svg:text").attr("transform", function(d){
//                 d.innerRadius = 0;
//                 d.outerRadius = r;
//                 return "translate(" + arc.centroid(d) + ")";}).attr("text-anchor", "middle").text( function(d, i) {
//                 return data[i].label;}
//             );


var labelArc = d3.svg.arc()
  .outerRadius(r - 40)
  .innerRadius(r - 40);

arcs.append("svg:text").attr("transform", function(d) {
  var c = labelArc.centroid(d);
  return "translate(" + c[0] * 1.4 + "," + c[1] * 1.8 + ")";
}).attr("text-anchor", "middle").text(function(d, i) {
  return data[i].label;
});
有没有办法完成这样的事情。下面的屏幕截图显示了Highcharts中的一个示例。

我想你们应该检查一下类似问题的答案,有人能解决这个问题吗?我已经在前面的评论中粘贴了类似问题的链接。遵循link@KamilNiski谢谢