데이터가 10으로 나눌 수없는 숫자로 부족하더라도 막대 그래프에 항상 10 개의 막대가 있습니까?

7rystan

나는 약간의 피클입니다. 한 번에 10 행의 데이터를로드하는 d3.js를 사용하여 막대 그래프를 만들었습니다. "다음"을 클릭 할 때마다 다음 10 개 행이로드됩니다. 그러나 내가 작업하는 데이터 세트는 항상 10으로 나눌 수있는 행 수를 가지지 않으므로 누락 된 값을 보완하려고하는 나머지 2 개 또는 3 개의 막대가 홀수 너비로 끝납니다. 위치를 이동하지 않고 매번 동일한 너비로 막대를로드하고 싶지만, 10 개 이상로드하도록 변경하려는 경우를 대비하여 x 축이 거기에 넣은 데이터의 양에 비례하도록하고 싶습니다. .

여기 내 현재 코드가 있습니다.

var x = d3.scale.ordinal()
    .rangeRoundBands([5, 525], .6)
    .domain(charges);

var y = d3.scale.linear()
    .range([150, 0])
    .domain([0, d3.max(swappedData) + ((d3.max(swappedData) / 10) + 10)]);

var rect = g.selectAll('.bar').data(data.slice(a,b));
rect.enter().append('rect');
rect.exit().remove('rect');
rect.attr('class', 'bar')
    .transition().duration(250)
    .attr('width', x.rangeBand())
    .attr('height', function(d) { return 150 - y(d.QuantityCharged) + 2})
    .attr('x', function(d) { return x(d.unslicedCharge) })
    .attr('y', function(d) { return y(d.QuantityCharged) });
Gerardo Furtado

이를 처리하기위한 몇 가지 다른 접근 방식이 있습니다 (따라서이 질문은 너무 광범위 할 수 있습니다 ).

이 접근 방식에서는 현재 데이터 배열을 자리 표시 자로 구성된 배열과 병합합니다.

var merged = d3.merge([data,
    d3.range(10 - data.length).map(function(d, i) {
        return {
            name: "bar" + i,
            value: 0
        };
    })
]);

여기에서 자리 표시자는 값이 0으로 name시작 하는 속성을 가지고 bar있습니다 (데이터 구조를 공유하지 않았기 때문에 더미를 만들어야했습니다).

병합 함수는 자리 표시 자 개체를 사용하여 길이가 10이 될 때까지 데이터 배열을 완료합니다. 데이터에 이미 10 개의 개체가있는 경우 자리 표시자가 생성되지 않습니다. 데이터에 4 개의 개체가있는 경우 6 개의 자리 표시자가 생성됩니다.

그런 다음 축 생성기에서 자리 표시자를 제거하면됩니다.

다음은 데모입니다. 4 개의 데이터 세트가 있으며 모두 동일한 함수를 사용하여 그려집니다.

var data = [
  [{name: "foo", value:10},{name: "foo2", value:40},{name: "foo3", value:30},{name: "foo4", value:10}],
  [{name: "foo", value:10},{name: "foo2", value:40},{name: "foo3", value:40},{name: "foo4", value:90},{name: "foo5", value:10},{name: "foo6", value:70}],
  [{name: "foo", value:50}],
  [{name: "foo", value:10},{name: "foo2", value:40},{name: "foo3", value:40},{name: "foo4", value:90},{name: "foo5", value:10},{name: "foo6", value:70},{name: "foo7", value:10},{name: "foo8", value:40},{name: "foo9", value:30},{name: "foo10", value:10}]
];

data.forEach(function(d) {
  draw(d);
});

function draw(data) {

  var svg = d3.select("body")
    .append("svg")
    .attr("width", 500)
    .attr("height", 100);

  var merged = d3.merge([data, d3.range(10 - data.length).map(function(d, i) {
    return {
      name: "bar" + i,
      value: 0
    };
  })]);

  var xScale = d3.scale.ordinal()
    .rangeRoundBands([20, 480], .6)
    .domain(merged.map(function(d) {
      return d.name
    }));

  var yScale = d3.scale.linear()
    .domain([0, 100])
    .range([80, 10]);

  var rects = svg.selectAll("foo")
    .data(merged)
    .enter()
    .append("rect")
    .attr("x", function(d) {
      return xScale(d.name)
    })
    .attr("y", function(d) {
      return yScale(d.value)
    })
    .attr("width", xScale.rangeBand())
    .attr("height", function(d) {
      return 80 - yScale(d.value)
    })
    .attr("fill", "teal");

  var xAxis = d3.svg.axis()
    .orient("bottom")
    .scale(xScale)
    .tickValues(xScale.domain().filter(function(d) {
      return d.substring(0, 3) != "bar"
    }));

  var gX = svg.append("g")
    .attr("transform", "translate(0,80)")
    .call(xAxis);

}
line,
path {
  fill: none;
  stroke: black;
}
<script src="https://d3js.org/d3.v3.min.js"></script>

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관