Sto usando d3js per visualizzare una rappresentazione in tempo reale delle viste di un sito web. Per questo io uso un layout dello stack e aggiorno il mio set di dati di JSON al momento.Visualizza solo valori interi lungo l'asse y in d3.js quando l'intervallo è 0-1 o 0-2
Quando sull'asse delle y è visualizzata solo 1 o 2, che è dinamica in relazione alla quantità di viste nel grafico, le etichette degli assi sono: 1 =>0, 0.2, 0.4, 0.6, 0.8, 1
, le etichette degli assi sono: 2 =>0, 0.5, 1, 1.5, 2
Questo non ha senso per il mio set di dati poiché mostra le visualizzazioni di una pagina e non è possibile avere una mezza vista.
Ho una scala lineare in d3js baso mio asse y su
var y_inverted = d3.scale.linear().domain([0, 1]).rangeRound([0, height]);
Secondo the documentation of rangeRound() devo ottenere solo valori interi su questa scala. Per disegnare il mio asse che uso:
var y_axis = svg.append("g")
.attr("class", "y axis")
.attr("transform", "translate(0,0)")
.call(y_inverted.axis = d3.svg.axis()
.scale(y_inverted)
.orient("left")
.ticks(5));
Poiché si tratta di un'applicazione in tempo reale aggiorno questo ogni secondo chiamando:
function update(){
y_inverted.domain([yStackMax, 0]);
y_axis.transition()
.duration(interval)
.ease("linear")
.call(y_inverted.axis);
}
yStackMax viene calcolato da uno stackLayout, per quanto ne so i dati utilizzati per i valori y contengono solo numeri interi.
var yStackMax = d3.max(layers, function(layer) {
return d3.max(layer, function(d) {
return d.y0 + d.y;
});
});
Ho provato diverse cose per ottenere un valore corretto per il mio asse y.
d3.svg.axis()
.scale(y_inverted)
.orient("left")
.ticks(5).tickFormat(d3.format(",.0f"))
mi ha fatto la più vicina sofar, ma mostra ancora 0, 0, 0, 1, 1, 1
Fondamentalmente quello che voglio è quello di avere solo 1 tick quando yStackMax
è 1, 2 zecche quando è 2, ma dovrebbe funzionare anche se yStackMax
è 12 o 1.000.000
btw, se si è soddisfatti con una delle risposte, si prega di accettarlo. – Juve