2013-03-22 23 views
9

Sono relativamente nuovo a D3, e non riesco a capire perché qualcosa non funziona .. Voglio disegnare un grafico a linee con d3, e questo funziona bene, ma ho problemi con gli assi.d3 linechart string dominio asse x

Con questo codice le cose vanno male da qualche parte e non vedo come risolvere ...

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; })); 

se R.età è un numero intero (come 1; 2; 3, ecc), funziona bene. Ma voglio stringhe sull'asse x. come ("netherlands", "Inghilterra", "Belgio").

Quindi se d.age è un numero intero disegna il grafico ok, se d.age è una stringa non disegna nulla.

Ho anche provato invece di usare l'ordinale, ma questo ha dato un grafico errato. (strane linee di sguardo ...).

Spero che qualcuno possa darmi una mano.

risposta

17

Se si desidera utilizzare valori categoriali su un asse, è necessaria una scala categoriale (ordinale). Dai un'occhiata a the documentation. Il tuo codice sarebbe simile

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; })); 

notare che utilizzando map per estrarre i valori di stringa - questo può o non può essere implementato nel browser particolare, vedere here per maggiori dettagli.

+0

Grazie per voi la reazione, sapevo che avevo bisogno di una scala ordinale, ma questo ha dato un grafico così strana .. (looping linee, ecc). Ma ho usato la gamma invece di rangeRoundBands. Quindi questo ha risolto il problema, (ora ho solo un piccolo problema che i punti e gli xax non sono sullo stesso livello. (C'è qualche spostamento visibile)). –

+0

Mi chiedevo perché usare rangeRoundBands invece di rangeBands? Sembra che eviti gli artefatti di antialiasing, ma non è sicuro che ci fosse un altro motivo per usarlo. Grazie. – yoyodunno

+0

Questa è l'unica ragione. –

5

Usa

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

Ecco Fiddle link http://jsfiddle.net/sk2Cf/

+0

grazie per la tua reazione. Era già stato risolto con la soluzione sopra, ma anche questa soluzione che hai fornito funzionava. Lo terrò a mente. –

+0

Grazie! Non potrei immaginare una soluzione più elegante. –

+0

Ho appena trovato questa domanda e ho provato il violino, ma ha lo stesso problema che ho attualmente nel mio codice: la posizione x del grafico non è la stessa della posizione x delle etichette della scala x. Puoi vederlo meglio se rimuovi l'interpolazione. La posizione x della linea è dove si trova la posizione in alto a sinistra di una barra se si trattasse di un grafico a barre. – kel