Erstellen eines D3-Kreisdiagramms, das den Spieler anzeigen und als Prozentsatz der insgesamt erzielten Punktzahl einstufen soll. Die Daten werden auf Klicks gebaut und aktualisiert ein Array namens playersObj
die wie folgt aussieht ...D3 Aktualisierung der lokalen Daten und Neuzeichnen der Torte, so wie sie aktualisiert wird
var playersObj = [
{"playerName":"Jessica Jones","playerID":157,"playerScore":2},
{"playerName":"Luke Cage","playerID":158,"playerScore":0},
{"playerName":"Matt Murdock","playerID":159,"playerScore":6}
]
Während mein Skript ich die playerScore erhöhen und bin versucht, das Diagramm entsprechend zu aktualisieren. Hier ist der Code Ich habe so weit, wo ich die Besonderheiten einrichten und dann versuchen, sie zu zeichnen, wie Daten aktualisiert ...
/*
----------------------------------------------------------------------
DONUT CHART
----------------------------------------------------------------------
*/
//Set color range
var color = d3.scale.ordinal()
.range(["red", "green", "blue", "purple", "orange"]);
//Set stage dimensions
var width = 300;
var height = 300;
var radius = Math.min(width, height)/2;
//Select div and add svg into it
var svg = d3.select("#donut").append("svg")
.attr("width", width)
.attr("height", height);
var group = svg.append("g")
.attr("transform", "translate(" + radius + "," + radius + ")")
//Set inner and outer radius of chart
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(radius - 75);
//UPDATE THE DONUT
function updateDonut(){
console.log("Updating donut...");
//console.log(donutData);
//Create pie chart
var pie = d3.layout.pie()
.value(function(d) {
return d.playersScore;
});
var arcs = group.selectAll(".arc")
.data(pie(playersObj))
.enter()
.append("g")
.attr("class", "arc");
console.log(pie(playersObj));
arcs.append("path")
.attr("d", arc)
.attr("fill", function(d) {
//console.log(d);
return color(d.data.playerName);
});
arcs.append("text")
.attr("transform", function(d) {
return "translate(" + arc.centroid(d) + ")";
})
.text(function(d) {
return d.data.firstName+": "+d.data.playersScore
});
}
Als ein Ergebnis dieser, ich ein Diagramm mit zwei Probleme bekommen. Zunächst fügt das Diagramm Text an Einträge an, die einen playerScore von 0 haben. Da jeder mit 0 beginnt, wird eine große Anzahl von Namen übereinander gestapelt, da ihre Teile des Kuchens keinen Wert haben. Das zweite Problem ist, dass der Kuchen nach dem zweiten Update nie aktualisiert wird. playersObj aktualisiert und console.log(pie(playersObj));
zeigt die richtigen Werte, aber die Diagrammanzeige ändert sich nie.
Ich habe die Bostock-Beispiele mit den Äpfeln gesehen, aber das ändert Daten und ich muss einfach aktualisieren und neu zeichnen. Andere Beiträge scheinen unterschiedliche Ansätze zu verfolgen, so dass es für mich verwirrend ist, wie ihre Lösungen funktionieren.
Dank Will, fügte ich eine Geige mit Ihrem Code besser zu veranschaulichen, was passiert ist und was ich versuche zu erreichen. Grundsätzlich beginnt der Kuchen bei 0, die Punktzahl des Spielers wird erhöht, die Aktualisierung des Kreisdiagramms. Fiddle hier verfügbar: https://jsfiddle.net/johnlayne/e2wyd1fr/ – Layne
Verwaltet, um den Cluster von überlappenden Etiketten mit einer einfachen if-Anweisung zu verbergen. Trotzdem kann der Kuchen nicht aktualisiert werden. https://jsfiddle.net/johnlayne/e2wyd1fr/1/ – Layne