function chart2(data) {
const svg = d3.select(DOM.svg(width, height))
.attr("viewBox", `${-width / 2} ${-height / 2} ${width} ${height}`)
.style("width", "100%")
.style("height", "auto")
.style("font", "10px sans-serif");
const innerRadius = 25;
const outerRadius = Math.min(width, height) / 3;
let margin = {top: 20, right: 20, bottom: 20, left: 20};
let numSegments = 365;
let segmentHeight = (outerRadius - innerRadius)/24;
let offset = innerRadius + Math.ceil(data.length / numSegments) * segmentHeight;
let radialLabels = [...new Set(data.map(d => d.hr))];
let segmentLabels = [...new Set(pge_src.map(d => daysIntoYear(d.date)))];
const g = svg.append("g")
.classed("circular-heat", true)
.attr("transform", "translate(0, 0)");
let ir = function(d, i) {
return innerRadius + (d.hr-1) * segmentHeight;
}
let or = function(d, i) {
return innerRadius + segmentHeight * d.hr;
}
let sa = function(d, i) {
return ((d.yearday-1) * 2 * Math.PI)/365;
}
let ea = function(d, i) {
//return 1/4 * 2 * Math.PI;
//return ((d.day + 1) * 2 * Math.PI)/30;// / numSegments;
return (d.yearday * 2 * Math.PI)/365;
}
g.selectAll("path").data(data)
.enter().append("path")
.attr("d", d3.arc().innerRadius(ir).outerRadius(or).startAngle(sa).endAngle(ea))
.attr("fill", d => { return colorScale(d.flights) });
var labels = svg.append("g")
.classed("labels", true)
.classed("radial", true)
.attr("transform", "translate(0, 0)");
var lsa = 0.01; //Label start angle
var labels = svg.append("g")
.classed("labels", true)
.classed("radial", true)
.attr("transform", "translate(0,0)");
labels.selectAll("def")
.data(radialLabels).enter()
.append("def")
.append("path")
.attr("id", function(d, i) {return "radial-label-path-test-"+i;})
.attr("d", function(d, i) {
// console.log(i);
var r = innerRadius + ((i + 0.2) * segmentHeight);
return "m" + r * Math.sin(lsa) + " -" + r * Math.cos(lsa) +
" a" + r + " " + r + " 0 1 1 -1 0";
});
labels.selectAll("text")
.data(radialLabels).enter()
.append("text")
.append("textPath")
.attr("xlink:href", function(d, i) {return "#radial-label-path-test-"+i;})
.style("font-size", 0.8 * segmentHeight + 'px')
.text(function(d) {return d;});
//Segment labels
var segmentLabelOffset = 10;
// var r = innerRadius + Math.ceil(data.length / numSegments) * segmentHeight + segmentLabelOffset;
// labels = svg.append("g")
// .classed("labels", true)
// .classed("segment", true)
// .attr("transform", "translate(0, 0)");
// labels.append("def")
// .append("path")
// .attr("id", "segment-label-path-test")
// .attr("d", "m0 -" + r + " a" + r + " " + r + " 0 1 1 -1 0");
// labels.selectAll("text")
// .data(segmentLabels).enter()
// .append("text")
// .append("textPath")
// .attr("xlink:href", "#segment-label-path-test")
// .attr("startOffset", function(d, i) {return i * 100 / numSegments + "%";})
// .text(function(d) {return d;})
// .attr("font-size", 2);
let arcLabelsG = labels
.selectAll('.arc-label')
.data(arcLabels)
.enter()
.append('g')
.attr('class', 'arc-label');
let dayAngle = 360 / 365;
arcLabelsG
.append('text')
.text(function(d) {
return d.month;
})
.attr('x', function(d) {
let monthAngle = 360 * (d.days / 365);
let labelAngle = d.start * dayAngle;// + monthAngle / 5;
let labelRadius = outerRadius + segmentLabelOffset;
return labelX(labelAngle, labelRadius);
})
.attr('y', function(d) {
let monthAngle = 360 * (d.days / 365);
let labelAngle = d.start * dayAngle;// + monthAngle / 5;
let labelRadius = outerRadius + segmentLabelOffset;
return labelY(labelAngle, labelRadius);
})
.style('text-anchor', function(d, i) {
return i < arcLabels.length / 2 ? 'start' : 'end';
});
return svg.node();
}