2016-10-03 6 views
0

Neuling d3.js hier, ich versuche, um die Probe von gestapeltes Balkendiagramm mit d3.stack() (Anmerkung: nicht d3.layout.stack()) zu verstehen, aus der Beispiellink: http://bl.ocks.org/mbostock/3886208 (von Mike Bostock)d3.js: Wie füllt Attribut svg Gruppenelement zuzugreifen (gestapeltes Balkendiagramm)

Ich versuche, das Fill-Attribut der einzelnen SVG-Gruppenelemente aufzurufen, die jeweils eine einzelne "Schicht"/Altersgruppe darstellen. Um dies zu tun, muss ich eine kleine Änderung an der „Enter“ Teil:

var seriesG = g.selectAll(".serie") 
    .data(function(){return stackedColumns;}) 
    .enter().append("g") 
     .attr("class", "serie") 
     .attr("fill", function(d) {return z(d.key); }); 

Seit console.log(seriesG); in zi {_groups: Array[1], _parents: Array[1]} führte, dachte ich, dass die sieben svg Gruppenelemente, die die sieben Altersbereich Gruppen darstellt, ist zugänglich in der _groups Mitglied Objekt.

Jetzt kann ich jedes svg Gruppenelement von dieser grundlegenden rekursiven Routine zugreifen:

seriesG._groups.forEach(function(d, i){ 
    console.log(d); 
    });
der [g, g, g, g, g, g, g] im Browser Element Inspektor Konsole zeigt (Oper). Was ich herausfinden möchte, ist die korrekte Syntax, um auf das Fill-Attribut des 'd' -Datums zuzugreifen. Und da ich durch Beobachtung der Browser-Konsole weiß, dass die 'Füllung' das Mitglied des 'outerHTML' Mitgliedsattributs des 'd'-Datums ist, muss ich zuerst wissen, wie auf dieses' outerHTML'-Attribut zugegriffen wird. Ich habe verschiedene Syntax versucht:

  • console.log(d.attr("outerHTML"));
  • console.log(d.attr.outerHTML);
  • console.log(d.outerHTML);
  • console.log(d["outerHTML"]);

Die ersten beiden Versuche resultierten in Uncaught TypeError: d.attr is not a function, während die restlichen zwei sind undefined Operationen.

Also, in der kurzen Version meiner Frage ist: "Was ist die richtige Syntax für den Zugriff auf die Füllung jedes SVG-Gruppenelement erstellt mit d3.stack()?"

Mein Ziel ist es, verschiedene Funktionen ähnlich zu dieser Probe Link hinzuzufügen: http://bl.ocks.org/KatiRG/f7d064cd9c3efbc3c360

+0

Ihre * d * Objekt ist ein Array, müssen Sie eine * forEach ausführen * auf diesem Array, um auf * g * -Elementattribute zuzugreifen. –

+0

Danke für den Hinweis @Mario Alexandro Santini, 'seriesG._groups.forEach (function (d, i) { \t d.forEach (function (datum) { \t \t Konsole.Protokoll (Datum); } }); 'zeigt erfolgreich' ... 'Dies ist jedoch immer noch die Hälfte der Weg, meine Frage bleibt unbeantwortet:" Was ist das? richtige Syntax, um auf das Füllattribut zuzugreifen? " 'console.log (datum.attr (" fill "));' resultierte in 'stackedBarChart.html: 70 Uncaught TypeError: datum.attr ist keine Funktion' während sowohl' console.log (datum.fill); 'und' console.log (Datum ["fill"]); 'sind _undefined Operationen. – Rickard

+0

Ich schlage vor, dass Sie Ihre Frage zu klären, um Ihr Ziel zu klären. So wie es ist, Ihre Frage ist, wie Sie Ihre '._group' anti-Muster tun, was nicht klar ist. –

Antwort

1

Zuerst nicht verwenden _groups. Dies soll private zu dem Auswahlobjekt sein. Sie sollten die .nodes method verwenden.

Zweitens ist meine Frage, was willst du mit diesen Füllungen tun?

Der Code, den Sie schreiben möchten, ist dies:

seriesG.nodes().forEach(function(d){ 
    console.log(d3.select(d).attr('fill')); 
}); 

Aber je nach Zweck, und da Sie Ihre Schlüssel kennen (im Beispiel Sie diese verbinden, sind „65 Jahre und älter“, „45 bis 64 Jahre“, etc ..), dann wird der Füllungswert für jeden „Schlüssel“ kann einfach zurückgegeben werden wie:

z("65 Years and Over"); 
+0

Was ich mit den Gruppenfüllungen machen will: Ich will das wenn der User auf einen klickt Englisch: www.doc-o-matic.com/webhelp/TdlgEditEditE.html Bei einem bestimmten 'Legenden' Rechteck bleibt die Altersbalkengruppe mit der gleichen Füllung sichtbar, während die Balkengruppe mit der unterschiedlichen Füllung auf 'Opazität: 0' gesetzt wird, ähnliche Funktion mit [dieser Link] (http: //bl.ocks .org/KatiRG/f7d064cd9c3efbc3c360). Ich möchte jedoch dieselbe Funktionalität erreichen, indem ich das "fill" -Attribut der angeklickten Legende rect mit dem "fill" der Altersbereichsbalkengruppe abgleiche, was ein anderer Ansatz ist als der Beispiellink. – Rickard

+0

Und dazu glaube ich zuerst, dass ich in der Lage sein muss, das 'fill'-Attribut der Altersbereichsbalkengruppe zu extrahieren. Bitte korrigieren Sie mich, wenn Sie denken, dass dieser Ansatz falsch ist, ich bin schließlich ein Neuling. – Rickard

+0

kopieren und fügen Sie Ihre Antwort ein, es funktioniert nicht. 'seriesG.nodes(). forEach (function() { console.log (d3.select (this) .attr ('fill')); });' gibt diese Nachricht auf Opera: 'd3.v4. min.js: 6 Uncaught TypeError: r.getAttribute ist keine Funktion " – Rickard

Verwandte Themen