2012-11-27 11 views
19

Ho un grafico a barre d3 i cui valori vanno da 0-3. Desidero l'asse y per valori interi mostra solo che posso fare dad3 segni di graduazione sui numeri interi solo

var yAxis = d3.svg.axis().scale(y).orient("right").tickFormat(d3.format("d")); 

Tuttavia, vi sono ancora segni di graduazione le marcature non interi. L'impostazione del formato di spunta nasconde solo quelle etichette. Posso impostare in modo esplicito il numero di zecche o i valori di tick, ma quello che mi piacerebbe fare è solo essere in grado di specificare che i segni di spunta appaiono solo a valori interi. È possibile?

enter image description here

risposta

16

si potrebbe aggiungere .ticks (4) e .tickSubdivide (0) come ho fatto qui di seguito:

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("right") 
    .ticks(4) 
.tickFormat(d3.format("d")) 
    .tickSubdivide(0); 
+0

Sfortunatamente non sembra funzionare. Ho aggiunto una foto di come appare (non ho tickPadding 8, ma non dovrebbe essere importante). Ignora il fatto che le etichette superiore e inferiore sono tagliate, sto ancora lavorando su quella parte. –

+1

'.tickSubdivide (0)' dovrebbe fare il trucco. Hai valori non interi nei tuoi dati? Potresti provare a creare d3.format ("d") o d3.format ("f") insieme a .tickSubdivide. Assicurati anche di svuotare la cache del browser. Hai ragione sul fatto che .tickPadding è irrilevante qui. –

+0

Tutti i dati sono dati interi, e ho provato esattamente come lo hai tu qui, e sembra ancora l'immagine sopra ... –

6

È possibile programatically impostare il numero di zecche a data.length - 1 (questo risolve il problema che si era visto per un piccolo numero di zecche e)

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("right") 
    .tickFormat(d3.format("d")) 
    .ticks(data.length - 1) 
+1

data.length - 1 è correlato all'asse x, perché dovrebbe essere usato quando si impostano le tacche sull'asse y? Meglio sarebbe sth. come valore massimo per definire le zecche sull'asse y – peter

1

Usato questo suggerimento per fare questo lavoro su grafici dinamici (1 o più tabelle a pagina)

Questo ha fatto il trucco. Ho cambiato per essere Math.min (maxHeight + 1, yAxis.ticks()), quindi se l'altezza del grafico è inferiore a rispetto al numero di zecche, riduce il numero di zecche. - Jeff Storey 28 novembre '12 a 2:47

// It is either 10 or Maximum Chart height + 1 

     var graphValues = selection.data()[0].map(function(obj) { 
      return obj['count']; 
     }).compact(); 

     Array.prototype.maxValArray = function() { 
      return Math.max.apply(null, this); 
     }; 

     var maxValue = graphValues.maxValArray(); 

     yAxis.ticks(Math.min(maxValue + 1, 10)) 
0

Da tutte le soluzioni elencate, non sono stato in grado di sbarazzarsi fuori segni di graduazione.

.xAxis().ticks(4) 
.tickFormat(d3.format("d")); 

rimuovere le etichette ma non le zecche.

Quindi mi propongo di applicare una soglia su tick(). Se inferiore a 4, viene impostato sul limite stesso (0,1,2,3). È fatto con:

.on("preRedraw", function(chart) { 
    var maxTick = chart.group().top(1)[0].value; 
    if (maxTick < 4) { 
     chart.xAxis().ticks(maxTick); 
    } else { 
     chart.xAxis().ticks(4); 
    } 

});

Un jsfiddle è disponibile presso https://jsfiddle.net/PBrockmann/k7qnw3oj/

Fatemi sapere se c'è una soluzione più semplice. Saluti

Problemi correlati