Ich habe ein Donut-Diagramm mit D3 erstellt, das zwei Datensätze verwendet und jeweils unterschiedlich große Ringe anzeigt. Ich möchte dem Datensatz Beschriftungen hinzufügen (für eine Legende), aber die selectAll("path")
erwartet, dass jeder Datensatz ein einfaches Array von Werten ist, daher konnte ich die Beschriftungen nicht hinzufügen.D3 Konzentrisch/geschachteltes Donut-Diagramm
Unten ist der Code, den ich so weit und eine Geige haben:
var dataset = {
apples: [13245, 28479, 11111, 11000, 3876],
oranges: [53245, 28479, 19697, 24037, 19654],
};
var width = d3.select('#duration').node().offsetWidth,
height = 300,
cwidth = 33;
var colorO = ['#1352A4', '#2478E5', '#5D9CEC', '#A4C7F4', '#DBE8FB'];
var colorA = ['#58A53B', '#83C969', '#A8D996', '#CDE9C3', '#E6F4E1'];
var pie = d3.layout.pie()
.sort(null);
var arc = d3.svg.arc();
var svg = d3.select("#duration svg")
.append("g")
.attr("transform", "translate(" + width/2 + "," + height/2 + ")");
var gs = svg.selectAll("g").data(d3.values(dataset)).enter().append("g");
var path = gs.selectAll("path")
.data(function(d, i) { return pie(d); })
.enter().append("path")
.attr("fill", function(d, i, j) {
if (j == 0) {
return colorO[i];
} else {
return colorA[i];
}
})
.attr("d", function(d, i, j) {
if (j == 0) {
return arc.innerRadius(75 + cwidth * j - 17).outerRadius(cwidth * (j + 2.9))(d);
} else {
return arc.innerRadius(75 + cwidth * j - 5).outerRadius(cwidth * (j + 2.5))(d);
}
});