Как я могу связать массив объектов с дугами на круговой диаграмме D3?

Я строю круговую диаграмму, и мои данные представлены в форме JSON:

[
  {
    "Stage":"birth",
    "Avg":19071
  },
 { 
   //
 }
]

Я не знаю, как мне следует использовать функцию данных, чтобы связать эти данные JSON с моим выбором. Так что это не работает для меня:

pie = d3.layout.pie();

arcs = svg.selectAll("g.arc") 
  .data(pie(data)) // ?
  .enter()
  .append("g")
  .attr({
    "transform" : "translate(" + outerRadius + "," + outerRadius + ")",
    "class": function(d,i){
      console.log(d3.keys(d));
    }       
  });

pie.sort(null);

//Draw arc paths  
arcs.append("path")
  .attr({
    "d": arc,
    "class" : "arc"
  });

Как мне использовать.data, чтобы иметь доступ к каждой паре ключ / значение в json? Извините, если это действительно простой вопрос, но я не могу понять, как работают клавиши в этом случае.

1 ответ

Решение

Вы должны дать свой layout.pie функция доступа к значению.

var pie = d3.layout
  .pie()
  .sort(null)
  .value(function(d){
    return d.Avg; //<-- d3 will pie the values in Avg property
   });

Полный рабочий образец:

<!DOCTYPE html>
<html>

<head>
  <script data-require="d3@3.5.3" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script src="script.js"></script>
</head>

<body>
  <script>
    var data = [{
      "Stage": "birth",
      "Avg": 19071
    }, {
      "Stage": "death",
      "Avg": 10000
    }];
    
    var svg = d3.select('body')
      .append('svg')
      .attr('width', 500)
      .attr('height', 500);
      
    var colors = d3.scale.category10();

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

    var arc = d3.svg.arc()
      .outerRadius(90)
      .innerRadius(0);

    var arcs = svg.selectAll("g.arc")
      .data(pie(data)) //<-- this is fine
      .enter()
      .append("g")
      .attr({
        "transform": "translate(" + 100 + "," + 100 + ")",
        "class": function(d, i) {
          return d.data.Stage; //<-- after pieing the data, the raw data is then in the data property
        }
      });

    //Draw arc paths  
    arcs.append("path")
      .attr({
        "d": arc,
        "class": "arc"
      })
      .style('fill', function(d,i){
        return colors(i);
      })
  </script>
</body>

</html>

Другие вопросы по тегам