donuts = {
let donutGroups = donutLayer.selectAll("g")
.data(rollupData)
.join("g")
.attr("id", d => d[0])
.attr("transform", d => {
let stateAbbr = d[0];
let xLoc = usGridMapData.filter(d => d.code == stateAbbr)[0].col * gridOptions.boxSize;
let yLoc = usGridMapData.filter(d => d.code == stateAbbr)[0].row * gridOptions.boxSize;
return "translate(" + xLoc + " " + yLoc + ")";
});
donutGroups.each(function (d,i,nodes) {
let thisData = d;
let thisSVGGroup = d3.select(this);
let thisStateFuelData = d[1];
let thisStateFuelDataSorted = d3.sort(thisStateFuelData, (a,b) => d3.descending(a[1],b[1]));
let thisStateSumGeneration = d3.sum(thisStateFuelData, d => d[1]);
let scaleThisStateDonut = scaleDonuts(thisStateSumGeneration);
let donut = dvDonut(thisSVGGroup, thisStateFuelDataSorted, scaleThisStateDonut, 5);
thisSVGGroup.attr("transform", d => {
let xLoc = (usGridMapData.filter(d => d.code == thisData[0])[0].col * gridOptions.boxSize) + (gridOptions.boxSize/2 - scaleThisStateDonut);
let yLoc = (usGridMapData.filter(d => d.code == thisData[0])[0].row * gridOptions.boxSize) + (gridOptions.boxSize/2 - scaleThisStateDonut);
return "translate(" + xLoc + " " + yLoc + ")";
})
})
}