Я использую d3js для отображения представления в реальном времени видов веб-сайта. Для этого я использую компоновку стека, и я обновляю свой набор данных JSON на данный момент.
Если на оси y отображается только 1 или 2 вида, которые являются динамическими, связанными с количеством просмотров на графике, метки оси: 1 = > 0, 0.2, 0.4, 0.6, 0.8, 1
, метки оси: 2 = > 0, 0.5, 1, 1.5, 2
Это не имеет никакого смысла для моего набора данных, поскольку он отображает виды страницы, и вы не можете иметь половину представления.
У меня есть линейная шкала в d3js. Я основываю свою ось y на
var y_inverted = d3.scale.linear().domain([0, 1]).rangeRound([0, height]);
В соответствии с документацией rangeRound() Мне нужно получить только целые значения из этого масштаба. Для рисования моей оси я использую:
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));
Поскольку это приложение реального времени, я обновляю каждую секунду, вызывая:
function update(){
y_inverted.domain([yStackMax, 0]);
y_axis.transition()
.duration(interval)
.ease("linear")
.call(y_inverted.axis);
}
yStackMax вычисляется из stacklayout, насколько я знаю, данные, используемые для значений y, содержат только целые числа.
var yStackMax = d3.max(layers, function(layer) {
return d3.max(layer, function(d) {
return d.y0 + d.y;
});
});
Я попробовал несколько вещей, чтобы получить правильное значение для оси y.
d3.svg.axis()
.scale(y_inverted)
.orient("left")
.ticks(5).tickFormat(d3.format(",.0f"))
Получил мне ближайший софар, но он все еще отображает 0, 0, 0, 1, 1, 1
В основном то, что я хочу, состоит только в 1 тике, когда yStackMax
составляет 1, 2 тика, когда он равен 2, но он также должен работать, если yStackMax
составляет 12 или 1 000 000