2016-04-26 4 views
2

dieses wiederverwendbare Diagramm als Basis verwenden: http://bl.ocks.org/nnattawat/9368297ändern Farbbereich in einem d3 wieder verwendbaren Ringdiagramm auf der Anzahl der Datenpunkte in Abhängigkeit

ich einen Weg zu finden, ich versuche, den Farbbereich Satz auf die Anzahl der Basis zu ändern Bögen (Größe), ohne den Haupt Donut() neu schreiben zu müssen.

Zum Beispiel, ein Donuts getData Größe wäre 2 (mit den Farben grün und grau), und eine andere Donuts getData Größe wäre 3 (jetzt entfernen grau und ändern Sie die Farben zu grün, rot und gelb).

Ich kann die Farben nicht von donut() entfernen, es scheint, also habe ich versucht, einen Weg zu finden, vielleicht Farben bestimmten Datenpunkten zuzuordnen, aber ich kann das mit dieser Vorlage nicht herausfinden.

Bearbeiten: Angeben von bereits vorgenommenen Codeänderungen.

Ich habe 6 verschiedene getData Funktionen, etwa wie folgt:

var getFirstDonutData = function() { 
    var size = 2; 
    var data = [firstData1, firstData2]; 
    var text = ""; 
    d3.select("#data"); 
    return data; 
}; 

var getSecondDonutData = function() { 
    var size = 3; 
    var data = [secondData1, secondData2, secondData3]; 
    var text = ""; 
    d3.select("#data"); 
    return data; 
}; 

var getThirdDonutData = function() { 
    var size = 2; 
    var data = [thirdData1, thirdData2]; 
    var text = ""; 
    d3.select("#data"); 
    return data; 
}; 

Dann 6 verschiedene der folgenden:

var twoPointDonut = donut() 
       .$el(d3.select("#twoPointDonut ")) 
       .data(getFirstDonutData()) 
       .render(); 

var threePointDonut = donut() 
       .$el(d3.select("#threePointDonut ")) 
       .data(getSecondDonutData()) 
       .render(); 

var otherTwoPointDonut = donut() 
       .$el(d3.select("#otherTwoPointDonut ")) 
       .data(getThirdDonutData()) 
       .render(); 

Antwort

2

Die Füllung des Lichtbogens durch die color() Funktion auf dieser Leitung bestimmt wird, :

.style("fill", function(d) { return color(d.data.key); }); 

Anstelle einer Funktion können wir wählen eine Reihe von Farben basierend auf dem Index. Ändern Sie die obige Zeile zu lesen:

.style("fill", function(d, i) { return color[i]; }); 

Jetzt müssen wir die Liste der verfügbaren Farben ändern basierend auf der Anzahl von Datenpunkten (Anzahl der Schlüssel in dem Datenobjekt). Oberhalb der color() Funktion hinzufügen:

var dataSize = Object.keys(getData()).length 
var color = d3.scale.category20(); // This line was already here 

Schließlich müssen wir auf ein Array die color Variable aus einer Funktion ändern. Das Array wird basierend auf der dataSize variieren, so eine switch Anweisung funktioniert hier sehr gut. Ersetzen Sie die Farbdefinition:

var color; 

switch (dataSize) { 
    case 2: 
    color = ['green' , 'gray']; 
    break; 
    case 3: 
    color = ['green', 'red', 'yellow']; 
    break; 
} 

Dadurch erhalten Sie grün und grau, wenn nur zwei Datenpunkte vorhanden sind; und grün, rot und gelb, wenn 3 Datenpunkte vorhanden sind. Sie können mehr case s für mehr Datenpunkte hinzufügen.

Everything in one JSFiddle.

Mit zwei Datenpunkte:

Donut chart showing two data points

Mit drei Datenpunkte:

Donut chart showing two data points


Edit: Da Sie mehr als ein Diagramm und eine Reihe von Daten auf der gleichen Seite verwenden, müssen Sie diesen ganzen Block zu innerhalb die Object.render() Funktion bewegen:

var dataSize = Object.keys(getData()).length; 
var color; 

switch (dataSize) { 
    case 2: 
    color = ['green' , 'gray']; 
    break; 
    case 3: 
    color = ['green', 'red', 'yellow']; 
    break; 
} 

und ändern Sie dann die dataSize Variable die bekommen Länge des in data Objekts Schlüssel übergeben:

var dataSize = Object.keys(data).length; 

New complete JSFiddle.

+0

Danke, das Sinn macht. Ich habe jedoch einige andere Bedenken und habe die Frage aktualisiert. Ziemlich viel, ich schuf separate getData(), um einzelne Donuts unterzubringen, da die Daten von spezifischen Variablen kommen. Da der Hauptdonut() "getData" speziell verwendet, wäre ich nicht in der Lage, Multiples so zu erstellen, wie ich gerade bin. Ich habe versucht, die Daten als ein anderes Array zu übergeben, aber dann konnte der Donut es nicht rechtzeitig sehen und ich konnte es nicht laden. –

+1

Ich verstehe. Ich habe meiner Antwort ein Update hinzugefügt. – Travis

+1

Das war es! Vielen Dank. Es tut uns leid, wenn dies ein bisschen außerhalb des Umfangs ist, aber wissen Sie, ob es irgendwelche Nachteile hat, diese Informationen in der Renderfunktion zu haben? –

Verwandte Themen