2016-06-22 3 views
3

어제 비슷한 게시물을 만들었지 만 몇 가지 의견을 삭제하기로 결정한 후 내 문제가 실제로 무엇인지에 대해 잘못 판단하여 잘 해결했습니다. 그것을 더 정확하게 설명 할 수있을 것입니다.업데이트 된 데이터에 따라 사각형 크기 조정

3 개의 직사각형 크기를 새 데이터로 업데이트하고 싶지만 데이터 변경의 직접적인 결과로 크기를 조정하는 대신 상위 너비를 기준으로 유지하고 싶습니다.

아래는 plnk입니다.

http://plnkr.co/edit/eVfgniBQLbJLiMvAtWLI

이 예

내가 데이터를 변경하려면 방법을 보여줍니다. 여기서 문제는 축 너비가 부모 너비에 관계없이 확장/축소된다는 것입니다.

나는 해결책이 될 수 있다고 생각했다; 이 새로운 데이터 세트의 전체 양에 비해 각 숫자의 비율을 계산

// OLD SOLUTION 
     x: d.y, 
     y: d.x, 
     x0: d.y0 

    // NEW SOLUTION 
     x: (d.y/calcTotal) * width, 
     y: d.x, 
     x0: (d.y0/calcTotal) * width 

, 부모 컨테이너의 폭에 의해 다음 번 각 번호는 각 사각형이 크기 때마다 변경됩니다 있는지 확인하지만, 그것을 유지 부모 폭을 기준으로합니다.

그러나 데이터가 새로운 솔루션으로 업데이트 될 때 직사각형의 크기가 시각적으로 변경되지 않으므로 여기에서 나머지 기능을 수정하는 방법을 잘 모르겠습니다.

모든 조언에 감사드립니다!

감사

답변

2

문제는 작성 블록에서만 직사각형의 데이터를 설정한다는 것입니다.

당신은 RECT의 데이터를 업데이트해야

및 그룹 아래 같은 :

//update the group with new data 
groups = svg.selectAll('g') 
    .data(dataset) 


if (create) { 
    groups 
    .enter() 
    .append('g').attr('class', 'stacked') 
    .style('fill', function(d, i) { 
     return colours(i); 
    }) 
    rects = groups.selectAll('.stackedBar') 
    .data(function(d, i) { 
     return d; 
    }) 

    rects 
    .enter() 
    .append('rect').attr('class', 'stackedBar') 
    .attr('x', function(d) { 
     return xScale(d.x0); 
    }) 

    .attr('height', height) 
    .attr('width', 0); 
} else { 
    .//update the rectangle with new data 
    rects = groups.selectAll('.stackedBar') 
    .data(function(d, i) { 
     return d; 
    }) 
} 
//now do transition. 

작업 코드 here

+1

아, 멋지다. 우리가 우리의 답을 합치면 우리는 그가 원하는 것을 얻습니다, 감사합니다! –

+1

감사의 시린, 완벽하게 작동합니다! – alexc

1

내가 뭔가를 놓친 것,하지만 당신은 당신의 script.jswidth='100%'width=400 무엇을 변경하는 경우? 여기에 내 업데이트가 있습니다 : http://plnkr.co/edit/DKZdjposoN2omC55rM2d?p=preview

data.JSON의 데이터를 변경하면 원하는대로 상위 컨테이너의 비율에 따라 너비가 반영됩니다.

+0

이 작동하지 않습니다 - 나는 솔루션과 프랑스의 첫 번째 사각형을 클릭하면 = (71) %, 2 위 = 29.8 %, 3 위 = 32 % 마지막으로 화면 밖으로 밀어 내야합니다. – alexc

+0

맞아요.하지만 부모의 폭에 비례하여 모든 것을하고 있습니다. 정적으로 설정된'width = 400;'100 %'가 없으면 코드에서 똑같은 일을합니다. 이것은 단지 부모 폭에 상대적으로 만듭니다. 'width = 400; '을 사용하면 프랑스를 선택할 때 여전히 3 번째 섹션에서 시작됩니다. –

+0

예 -하지만 목표는 부모 데이터 폭에 관계없이 데이터를 실제 데이터의 크기와 상관없이 만드는 것입니다. 각 사각형은 부모의 너비에 비례하여 표시됩니다. 즉, 최근 배경을 화면에서 밀고 싶지는 않습니다. 나는 그들 모두가 100 % 안에 포함되고 표현되기를 바랍니다. – alexc

관련 문제