//data comes in through data.js which has all the variables. //color function determines the color //you can add more colors based on your data //alternatively you can have an interpolation or other means of choosing the color function color(d,i) { //create an array of colors depending on names var colors = [ {name: 'Male', fill: '#0079BB' }, {name: 'Female', fill: '#9E519F' }, {name: '0 < 12 years', fill: '#c792c8' }, {name: '13 years', fill: '#a47ebe' }, {name: '14 years', fill: '#827ebe' }, {name: '15 years', fill: '#7e95be' }, {name: '16 years', fill: '#7eb1be' }, {name: '17 years', fill: '#70b785' }, {name: '18 years', fill: '#84b770' }, ]; var findcolor = colors.find((c) => c.name === d); console.log(findcolor); //set default if (findcolor != undefined){ var fill = findcolor.fill; console.log(fill); }else { //var colorExtra = d3.scale.category20(); var colorExtra = d3.schemeCategory20; //add var fill = colorExtra[i]; //add console.log(fill); } return fill; } //some drawing variables which will be used repeatedly var margin = {left:40, right:40, top:40, bottom:40}; var width = 400 - margin.top - margin.bottom, height = 400 - margin.left - margin.right; var radius = Math.min(width, height) / 2; var donutWidth = 65; var legendRectSize = 18; // NEW var legendSpacing = 4; // NEW // Define the div for the tooltip var tooltipdiv = d3.select("body").append("div") .attr("class", "tooltip") .style("opacity", 0); //init() adds event listeners to the button to pass the data function init() { d3.select("#gender") .on("click", function(d,i) { pieChart(gender, 'gender') //pass the data and the key }) d3.select("#age") .on("click", function(d,i) { pieChart(age, 'Age') }) d3.select("#race") .on("click", function(d,i) { //num = document.getElementById("num").value pieChart(race, 'race_code') }) pieChart(gender,'gender') //creates default pie-chart } init(); //calls init() on load //creates the piechart with the data and the key function pieChart(data, key) { //empty the div - wipe the slate clean to create a new pie chart d3.select('#pie-chart-area').html(''); // create the svg var svg = d3.select("#pie-chart-area") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .attr('perserveAspectRatio', 'xMinYMid') //new .append("g") .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); //define arc var arc = d3.arc() .innerRadius(radius - donutWidth) .outerRadius(radius - 20); // second arc for labels var arc2 = d3.arc() .outerRadius(radius) .innerRadius(radius + 20); // import pie chart and data var pie = d3.pie() .sort(null) .startAngle(1.1*Math.PI) //new .endAngle(3.1*Math.PI) //new .value(function(d) { return d.count; }); //append the arcs based on the data var g = svg.selectAll(".arc") .data(pie(data)) .enter().append("g") .attr("class", "arc") .attr('d', arc) //draw the paths g.append("path") .style("fill", function(d,i) { return color(d.data[key],i); }) .transition().delay(function(d, i) { return i * 300; }).duration(300) .attrTween('d', function(d) { var i = d3.interpolate(d.startAngle, d.endAngle); return function(t) { d.endAngle = i(t); return arc(d); }; }) .each(function(d) { this._current = d; }); // store the initial values //g.append("text") //.attr("transform", function(d) { return "translate(" + arc2.centroid(d) + ")"; }) //.attr("dy", ".35em") //.attr("class", "d3-label") //.style("text-anchor", "middle") //.text(function(d) { return d.data[key]; }); //Append to the tooltip div on mouseover var sum = d3.sum(data, (d) => d.count); g.on("mouseover", function(d) { tooltipdiv.transition() .duration(200) .style("opacity", .9); tooltipdiv.html(d.data[key] +"
" + d.data.count + "
" + percentage(d.data.count, sum, 2)+"%") .style("left", (d3.event.pageX) + "px") .style("top", (d3.event.pageY - 28) + "px"); }) .on("mouseout", function(d) { tooltipdiv.transition() .duration(500) .style("opacity", 0); }); /* //add legend var legend = d3.select("#pie-chart-area") .attr("class", "legend") .selectAll("g") .data(data) .enter().append("g") .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); legend.append("rect") .attr("width", 18) .attr("height", 18) .style("fill", function(d, i) { return color(d.data[key]); }); legend.append("text") .attr("x", 24) .attr("y", 9) .attr("dy", ".35em") .text(function(d) { return d.data[key]; }); */ } //takes number and sum and returns percentage rounded to digits d function percentage(num, sum, d) { var p = (num/sum)*100; var digits = Math.pow(10, d); return (Math.round (p * digits))/digits; }