2013-03-22 3 views
9

Ich bin relativ neu zu D3, und ich kann nicht herausfinden, warum etwas nicht funktioniert .. Ich möchte ein Liniendiagramm mit d3 zeichnen, und das funktioniert gut, aber ich habe Probleme mit den Achsen.d3 linchart string domain x-achse

Mit dem folgenden Code geht es irgendwo falsch, und ich sehe nicht, wie zu lösen ...

var x = d3.scale.linear() 
.range([0, width]); 

var xAxis = d3.svg.axis() 
.scale(x) 
.orient("bottom"); 

x.domain(d3.extent(data, function(d) { return d.age; })); 

wenn d.age eine ganze Zahl (wie 1, 2, 3 usw.), es funktioniert Gut. Aber ich möchte Strings auf der X-Achse. wie ("Niederlande", "England", "Belgien").

Wenn also d.age eine Ganzzahl ist, zeichnet es die Grafik in Ordnung, wenn d.age eine Zeichenkette ist, zeichnet es nichts.

Ich versuchte auch anstelle von linear, Ordnungszahl zu verwenden, aber das gab eine falsche Tabelle. (komisch aussehende Linien ...).

Hoffe jemand kann mir helfen.

Antwort

17

Wenn Sie kategoriale Werte auf einer Achse verwenden möchten, benötigen Sie eine kategoriale (ordinale) Skala. Schauen Sie sich the documentation an. Ihr Code wäre so etwas wie

var x = d3.scale.ordinal().rangeRoundBands([0, width]); 
var xAxis = d3.svg.axis().scale(x).orient("bottom"); 

x.domain(data.map(function(d) { return d.country; })); 

Hinweis sehen, dass diese map verwendet die String-Werte zu extrahieren - dies kann oder kann nicht in Ihrem speziellen Browser implementiert werden, finden Sie here für weitere Details.

+0

Thanx für Sie Reaktion, ich wusste, dass ich eine Ordinalskala brauchte, aber das gab eine so seltsame Diagramm .. (Looping Linien usw.). Aber ich habe Range anstelle von RangeRoundBands verwendet. Das hat das Problem gelöst (jetzt habe ich nur ein kleines Problem damit, dass die Punkte und die Xaxis nicht auf der gleichen Ebene sind. (Es ist eine Verschiebung sichtbar)). –

+0

Ich frage mich, warum RangeRoundBands anstelle von RangeBands verwenden? Es scheint, als würde es Antialiasing-Artefakte vermeiden, aber nicht sicher, ob es einen anderen Grund gab, warum du es benutzt hast. Vielen Dank. – yoyodunno

+0

Das ist der einzige Grund. –

5

Verwenden

var x = d3.scale.ordinal().rangePoints([0, width]); 

Hier Fiddle Link- ist http://jsfiddle.net/sk2Cf/

+0

danke für deine reaktion. Es wurde bereits mit der obigen Lösung gelöst, aber diese Lösung, die Sie zur Verfügung gestellt haben, hat auch funktioniert. Ich werde es mir merken. –

+0

Danke! Ich könnte mir keine elegantere Lösung vorstellen. –

+0

Ich habe gerade diese Frage gefunden und die Geige ausprobiert, aber es hat das gleiche Problem, wie ich es derzeit in meinem Code habe: Die X-Position des Graphen ist nicht dasselbe wie die X-Position der x-Skalenbeschriftungen. Sie können es besser sehen, wenn Sie die Interpolation entfernen. Die X-Position der Linie befindet sich an der Stelle, an der die obere linke Position eines Balkens liegen würde, wenn es sich um ein Balkendiagramm handeln würde. – kel