Label outside arc (Pie chart) d3.js

后端 未结 8 1377
日久生厌
日久生厌 2020-11-28 03:55

I\'m new to d3.js and I\"m trying to make a Pie-chart with it. I have only one problem: I can\'t get my labels outside my arcs... The labels are positioned with arc.centroid

相关标签:
8条回答
  • 2020-11-28 04:32

    I don't know if this helps but I was able to create arcs where I place text, both, on the arc and just outside it. In one case, where I place magnitudes of the arc within the arcs, I rotate the text on the arc to match the angle of the arc. In the other, where I place the text outside of the arc, it is simply horizontal. The code is located at: http://bl.ocks.org/2295263

    My Best,

    Frank

    0 讨论(0)
  • 2020-11-28 04:33

    This was the low-cost answer I was happy with. It pushes all the labels out horizontally (that's where I had the extra space):

    g.append("text")
      .attr("transform", function(d) { 
          var pos = arc.centroid(d); 
          return "translate(" + (pos[0] + (.5 - (pos[0] < 0)) * radius) + "," + (pos[1]*2) + ")"; 
      })
      .attr("dy", ".35em")
      .style("text-anchor", function(d) { 
          return arc.centroid(d)[0] > 0 ? "start" : "end";
       })
      .text(function(d) { return d.label; });
    
    0 讨论(0)
  • 2020-11-28 04:34

    I can solve that problem - with trigonometry :).

    See fiddle: http://jsfiddle.net/nrabinowitz/GQDUS/

    Basically, calling arc.centroid(d) returns an [x,y] array. You can use the Pythagorean Theorem to calculate the hypotenuse, which is the length of the line from the center of the pie to the arc centroid. Then you can use the calculations x/h * desiredLabelRadius and y/h * desiredLabelRadius to calculate the desired x,y for your label anchor:

    .attr("transform", function(d) {
        var c = arc.centroid(d),
            x = c[0],
            y = c[1],
            // pythagorean theorem for hypotenuse
            h = Math.sqrt(x*x + y*y);
        return "translate(" + (x/h * labelr) +  ',' +
           (y/h * labelr) +  ")"; 
    })
    

    The only downside here is that text-anchor: middle isn't a great choice anymore - you'd be better off setting the text-anchor based on which side of the pie we're on:

    .attr("text-anchor", function(d) {
        // are we past the center?
        return (d.endAngle + d.startAngle)/2 > Math.PI ?
            "end" : "start";
    })
    
    0 讨论(0)
  • 2020-11-28 04:34

    I achieved the same by drawing percentage as labels outside the pie chart graph, here is the code http://bl.ocks.org/farazshuja/e2cb52828c080ba85da5458e2304a61f

    g.append("text")
            .attr("transform", function(d) {
            var _d = arc.centroid(d);
            _d[0] *= 2.2;   //multiply by a constant factor
            _d[1] *= 2.2;   //multiply by a constant factor
            return "translate(" + _d + ")";
          })
          .attr("dy", ".50em")
          .style("text-anchor", "middle")
          .text(function(d) {
            if(d.data.percentage < 8) {
              return '';
            }
            return d.data.percentage + '%';
          });
    
    0 讨论(0)
  • 2020-11-28 04:37

    The following CoffeeScript worked for me to get labels still inside the pie slices, but toward the outer edge:

    attr 'transform', (d) ->
      radius = width / 2 # radius of whole pie chart
      d.innerRadius = radius * 0.5
      d.outerRadius = radius * 1.5
      'translate(' + arc.centroid(d) + ')'
    
    0 讨论(0)
  • 2020-11-28 04:38

    yes baby, it's SOHCAHTOA

    function coordinates_on_circle(hyp, angle){
      var radian= angle * Math.PI / 180 //trig uses radians
      return {
        x: Math.cos(radian) * hyp, //adj = cos(r) * hyp
        y: Math.sin(radian) * hyp //opp = sin(r) * hyp
      }
    }
    var radius=100
    var angle=45
    coordinates_on_circle(radius, angle)

    0 讨论(0)
提交回复
热议问题