Exibe somente valores inteiros ao longo do eixo y em d3.js quando o intervalo é 0-1 ou 0-2
Eu estou usando o d3js para exibir uma representação em tempo real das visualizações de um site. Para isso eu uso um layout de pilha e atualizo meu conjunto de dados por JSON no momento.
Quando há apenas 1 ou 2 visualizações sendo exibidas no eixo y, o que é dinâmico relacionado à quantidade de visualizações no gráfico, as etiquetas do eixo são: 1 =>0, 0.2, 0.4, 0.6, 0.8, 1
, os rótulos dos eixos são: 2 =>0, 0.5, 1, 1.5, 2
Isso não faz sentido para o meu conjunto de dados, pois ele exibe vistas de uma página e você não pode ter metade de uma visualização.
Eu tenho uma escala linear em d3js eu baseio meu eixo y em
var y_inverted = d3.scale.linear().domain([0, 1]).rangeRound([0, height]);
De acordo coma documentação do rangeRound () Eu só deveria obter valores inteiros fora desta escala. Para desenhar meu eixo eu 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));
Como é um aplicativo em tempo real, eu atualizo isso a cada segundo chamando:
function update(){
y_inverted.domain([yStackMax, 0]);
y_axis.transition()
.duration(interval)
.ease("linear")
.call(y_inverted.axis);
}
yStackMax é calculado a partir de um stacklayout, até onde eu sei, os dados usados para os valores y contêm apenas inteiros.
var yStackMax = d3.max(layers, function(layer) {
return d3.max(layer, function(d) {
return d.y0 + d.y;
});
});
Eu tentei várias coisas para obter um valor adequado para o meu eixo y.
d3.svg.axis()
.scale(y_inverted)
.orient("left")
.ticks(5).tickFormat(d3.format(",.0f"))
Me pegou o sofar mais próximo, mas ainda exibe0, 0, 0, 1, 1, 1
Basicamente o que eu quero é ter apenas 1 tick quandoyStackMax
é 1, 2 carrapatos quando é 2, mas também deve funcionar seyStackMax
é 12 ou 1.000.000