chartSlope_v1 = {
const svg = d3.create('svg')
.attr('height', height)
.attr('width', width)
.style('font-family', 'sans-serif')
.style('font-size', 12)
const threshhold = 70;
const c = d3.scaleOrdinal()
.domain([true, false])
.range(['green', 'red']);
const planet_outer_radius = (Math.min(width, height) / 2) ;
const planet_inner_radius = planet_outer_radius * 0.5;
const human_outer_radius = planet_inner_radius * 0.9;
const human_inner_radius = human_outer_radius * 0.5;
const planet_outerScale = d3.scaleLinear()
.domain([100, 0])
.range([planet_inner_radius + 1, planet_outer_radius]);
const human_innerScale = d3.scaleLinear()
.domain([0, 100])
.range([human_inner_radius, human_outer_radius - 1]);
const planet_arc = d3.arc()
.innerRadius(planet_inner_radius)
.outerRadius(d => planet_outerScale(d.data.percentage))
.padRadius(0.5 * planet_outer_radius)
.padAngle(2/(0.65 * planet_outer_radius))
.cornerRadius(0)
const planet_default_text_arc = d3.arc()
.innerRadius(planet_inner_radius)
.outerRadius(planet_outer_radius)
.padRadius(0.5 * planet_outer_radius)
.padAngle(2/(0.65 * planet_outer_radius))
.cornerRadius(0)
const human_arc = d3.arc()
.innerRadius(d => human_innerScale(d.data.percentage))
.outerRadius(human_outer_radius)
.padRadius(0.5 * planet_outer_radius)
.padAngle(2/(0.65 * planet_outer_radius))
.cornerRadius(0)
const human_default_text_arc = d3.arc()
.innerRadius(human_inner_radius)
.outerRadius(human_outer_radius)
.padRadius(0.5 * planet_outer_radius)
.padAngle(2/(0.65 * planet_outer_radius))
.cornerRadius(0)
const planet_pie = d3.pie()
.padAngle(0.00)
.sort(null)
.value(1) // Optional: value() sets value accessor that returns a numeric value for a given datum.
// Make this constant to make the arc length constant and arc height variable?
const human_pie = d3.pie()
.padAngle(0.00)
.sort(null)
.value(1)
const planet_data = data_new.filter(d => d.inner_or_outer == "Outer").filter(d => d.percentage !== null);
const human_data = data_new.filter(d => d.inner_or_outer == "Inner").filter(d => d.percentage !== null);
const planet_arcs = planet_pie(planet_data);
const human_arcs = human_pie(human_data);
const planet_donut = svg.append('g')
.attr('transform', `translate(${width/2},${height/2})`) // Sets the center to not (0, 0)
const human_donut = svg.append('g')
.attr('transform', `translate(${width/2},${height/2})`)
planet_donut.selectAll('path')
.data(planet_arcs)
.join('path')
.attr('fill', d => c(d.data.percentage > threshhold))
.attr('d', planet_arc)
.append('title')
.text(d => "Planet/Outside"); // TODO: This is hover tooltip text, but I don't love it because you can't hover on the text
human_donut.selectAll('path')
.data(human_arcs)
.join('path')
.attr('fill', d => c(d.data.percentage > threshhold))
.attr('d', human_arc)
.append('title')
.text(d => "Human/Inside");
planet_donut.append('g')
.attr('font-family', 'sans-serif')
.attr('font-size', 12)
.attr('text-anchor', 'middle')
.selectAll('text')
.data(planet_arcs)
.join('text')
.attr('transform', d => `translate(${planet_default_text_arc.centroid(d)})`)
.call(text => text.append('tspan')
.attr('y', '-0.4em')
.attr('font-weight', 'bold')
.text(d => d.data.category)) // TODO: uhh is this right?
.call(text => text.filter(d => (d.endAngle - d.startAngle) > 0.25).append('tspan')
.attr('x', 0)
.attr('y', '0.7em')
.attr('fill-opacity', 0.7)
.text(d => d.data.category + "\n" + d.data.percentage.toLocaleString()));
// Ok I really have no idea what I'm doing here
// const human_label_center = (arc) => {
// return {
// x: (arc.startAngle() + arc.endAngle()) / 2,
// y: (arc.innerRadius() + arc.outerRadius()) / 2
// };
// //[(arc.startAngle + arc.endAngle) / 2, (arc.innerRadius + arc.outerRadius) / 2];
// }
human_donut.append('g')
.attr('font-family', 'sans-serif')
.attr('font-size', 12)
.attr('text-anchor', 'middle')
.selectAll('text')
.data(human_arcs)
.join('text')
//.attr('transform', d => `translate(${human_label_center(d).x, human_label_center(d).y})`) // This doesn't work
.attr('transform', d => `translate(${human_default_text_arc.centroid(d)})`)
//.attr('transform', d => `translate(${human_arc.centroid(d)})`)
.call(text => text.append('tspan')
.attr('y', '-0.4em')
.attr('font-weight', 'bold')
.text(d => d.data.category)) // TODO: uhh is this right?
.call(text => text.filter(d => (d.endAngle - d.startAngle) > 0.25).append('tspan') // TODO: Uhhhh
.attr('x', 0)
.attr('y', '0.7em')
.attr('fill-opacity', 0.7)
.text(d => d.data.category + "\n" + d.data.percentage.toLocaleString()));
return svg.node()
}