Я новичок в D3 и javascripts. Я пытаюсь создать анимированную вертикальную стеклянную гистограмму. Я нашел здесь пример для горизонтальной гистограммы. После настройки, я получил вертикальную стеклянную гистограмму, однако, растущую вниз. Вот моя отредактированная скрипка.
Обновление: после внесения нескольких настроек, в том числе предложенных ниже, это, в конечном счете, работает: окончательная работа вверх по нарастающей штабелированной гистограмме. Я чувствую, что место (места), которое мне нужно изменить, должно находиться внутри этого фрагмента кода
rects = groups.selectAll('.stackedBar')
.data(function(d,i) {console.log("data", d,i); return d; })
.enter()
.append('rect').attr('class','stackedBar')
.attr('y', function(d) { return yScale(d.y0); })
.attr('x', function(d, i) {return xScale(d.x); })
.attr('height',0)
.attr('width', xScale.rangeBand());
console.log(document.querySelectorAll(".stacked"));
var abc=document.querySelectorAll(".stackedBar");
rects
.transition()
.delay(function(d,i,j){console.log("pre",j); return j*500;})
.attr("y", function(d) { return yScale(d.y0); })
.attr("height", function(d) { return yScale(d.y); } )
.duration(1000);
Но я искал вокруг и пытался вернуть диапазон yScale, начальную позицию y, и никто из них не работал. Я также заметил, что несмотря ни на что, мой yAxis всегда находится ниже моей оси X, идущей в doward.
Сначала вы должны изменить ориентацию y-scale:
yScale = d3.scale.linear().domain([0,yMax]).range([height,0])
И ось x должна быть преобразована так, чтобы она начиналась с "высоты". В svg верх имеет высоту = 0, так что дно вашего svg равно "высоте":
svg.append('g')
.attr('class', 'axis')
.call(xAxis)
.attr("transform", "translate(0," + height + ")");
И последнее, но не менее важное: вы должны изменить ориентацию здания на сводной гистограмме:
rects
.transition()
.delay(function(d,i,j){console.log("pre",j); return j*500;})
.attr("y", function(d) { return yScale(d.y + d.y0); })
.attr("height", function (d) { return yScale(d.y0) - yScale(d.y + d.y0); } )
.duration(1000);
Вот обновленная скрипка.
SVG начинается с верхнего левого угла, поэтому указанная высота означает высоту страницы, поэтому некоторые вещи работают в обратном порядке от того, что вы ожидаете.
Сначала начните с вашего y-масштаба: диапазон должен отображаться в обратном порядке (высота, 0), а не (0, высота).
yScale = d3.scale.linear().domain([0,yMax]).range([height,0]),1
Аналогично, ось x должна быть преобразована, чтобы начать с высоты.
svg.append('g')
.attr('class', 'axis')
.call(xAxis)
.attr("transform", "translate(0," + height + ")");'