2017-09-20 9 views
1

D3 및 javascripts를 처음 사용합니다. 애니메이션 세로 형 막대 차트를 만들려고합니다. 가로 누적 막 대형 차트의 예는 here입니다. 조정 후 수직으로 쌓인 막 대형 차트가 아래쪽으로 늘어납니다. 여기에 my edited fiddle입니다.D3.js 누적 가로 막 대형 차트 부정적인 방향으로 증가

업데이트 : 아래에서 제안하는 것을 포함, 여러 가지 비틀기를 한 후,이 마지막으로 작동합니다 final working upward growing stacked bar chart 나는이 코드 청크 내에 있어야 변경해야 할 장소 (들)을 느낄

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); 

그러나 나는 주위를 검색하고 y의 초기 위치 인 yScale 범위를 되돌리려 고 시도했지만 그 중 아무 것도 작동하지 않았습니다. 나는 또한 내 yAxis가 항상 내 X 축 아래에 있다는 사실을 알았습니다.

+0

데이터가 0으로 시작되고 축이 맨 위에있는 동안 막대가 커집니다. 막대를 아래에서 위로 (1200+ 이상 시작) 성장 시키거나 전체 오리엔테이션을 변경하고 하단에 x 축을 갖기를 원하십니까? – 3TW3

+0

나는 아래쪽에 x 축을 갖기를 원한다. 그러면 바는 원래의 예제와 같이 하나씩 위쪽으로 자라나 수직 방향으로 자라고있다. – Rui

+0

좋아, 아래에 답변을 추가했습니다. – 3TW3

답변

1

첫째로 당신은 당신의 Y-규모의 방향을 변경해야합니다. 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); 

여기에 업데이트 된 fiddle이 있습니다.

+1

예! 당신의 대답은 정확히 4 시간 동안 나 혼자서 알아 내려고했던 변화들과 똑같습니다 ... 나는 이것을 좀 더 일찍 볼 수 있었으면 좋겠습니다. 고마워. 그리고 나는 네 시간 동안 다른 사람들의 예를 읽고 수많은 접근법을 시도하면서 무리를 배웠다. – Rui

+0

잘 했어! 나는 그것이 좋은 질문을 공식화하고 다른 사람들과 토론하려고 할 때 배우는 좋은 방법이라고 생각합니다. – 3TW3

1

SVG는 왼쪽 상단부터 시작하므로 '높이'는 페이지 아래의 높이를 의미하므로 일부는 예상했던 것과 반대로 작동합니다.

먼저 y 축척으로 시작하십시오. 범위는 (0, 높이)가 아닌 역순 (높이, 0)으로 매핑해야합니다.

yScale = d3.scale.linear().domain([0,yMax]).range([height,0]),1 

마찬가지로 x 축은 '높이'에서 시작하도록 변형되어야합니다.

yScale = d3.scale.linear().domain([0,yMax]).range([height,0]) 

그리고 그것은 "높이"에서 시작되도록 x 축이뿐만 아니라 변형해야합니다

 svg.append('g') 
     .attr('class', 'axis') 
     .call(xAxis) 
     .attr("transform", "translate(0," + height + ")");' 
+0

귀하의 제안에 따라 변경했습니다. 이제 x 축은 하단에 있고 y 축은 x 축 위에 있습니다. 이것은 큰 진보입니다. 그러나 실제 틱은 여전히 ​​역순입니다 : 1200은 맨 아래에 있고 0은 맨 위에 있습니다. – Rui

+0

'y'와 'height'의 최종 값 변경을 포함하여 조금 더 변경되었습니다. 이제는 내가 원하는 것처럼 정확하게 작동합니다. 작동하는 바이올린은 여기에 있습니다 : http://jsfiddle.net/maggiehu/e0r2pzc0/5/ – Rui