AngularJS with D3

by Rishabh Sharma

HTML

<script src="https://d3js.org/d3.v3.min.js"></script>
<button id="refresh">Refresh Data</button>
<div id="chart"></div>

CSS

body {
  font: 10px sans-serif;
}

svg {
  border: 1px solid black;
}

JavaScript

var getData = function(){
  var size = 3;
  var data = {};
  var text = "";
  for(var i=0; i<size; i++){
    data["data-"+(i+1)] = Math.round(Math.random() * 100);
    text += "data-"+ (i+1) +" = " + data["data-"+(i+1)] + "<br/>";
  };
  d3.select("#data").html(text);
  return data;
};

var chart = donut()
              .$el(d3.select("#chart"))
              .data(getData())
              .render();


d3.select("#refresh").on("click", function(){
  chart.data(getData()).render();
});


// CHART CODE BELOW

function donut(){  
  // Default settings
  var $el = d3.select("body")
  var data = {};
  // var showTitle = true;
  var width = 960,
      height = 400,
      radius = Math.min(width, height) / 2;

  var currentVal;
  var color = d3.scale.category20();
  var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.value; });

  var svg, g, arc; 


  var object = {};

  // Method for render/refresh graph
  object.render = function(){
    if(!svg){
      arc = d3.svg.arc()
      .outerRadius(radius)
      .innerRadius(radius - (radius/2.5));

      svg = $el.append("svg")
        .attr("width", width)
        .attr("height", height)
      .append("g")
        .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

      g = svg.selectAll(".arc")
        .data(pie(d3.entries(data)))
      .enter().append("g")
      .attr("class", "arc");

      g.append("path")
        // Attach current value to g so that we can use it for animation
        .each(function(d) { this._current = d; })
        .attr("d", arc)
        .style("fill", function(d) { return color(d.data.key); });
      g.append("text")
          .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
          .attr("dy", ".35em")
          .style("text-anchor", "middle");
      g.select("text").text(function(d) { return d.data.key; });

      svg.append("text")
          .datum(data)
          .attr("x", 0 )
          .attr("y", 0 + radius/10 )
  ...