2013-12-20 2 views
2

일련의 직사각형이 d3.js을 사용하여 100 개의 개체 배열을 가져 와서 그려졌습니다. console.log(data)에 새 데이터가 검색되는 것으로 표시 되더라도 새 데이터 요소는 모든 직사각형을 추가하지 않는 것처럼 보입니다.d3.js 차트가 새 데이터로 업데이트되지 않았습니다.

.enter().append()이 잘못 사용 되었습니까?

function init() { 
    var width = 800, 
     height = 400, 
     margin = 50; 

    chart = d3.select('#chart') 
       .append('svg:svg') 
       .attr('width', width) 
       .attr('height', height); 
} 

function do_update() { 
    data = fetch_latest_top100(); 
    console.log(data) 

    chart.selectAll('rect') 
     .data(data) 
     .enter() 
     .append('svg:rect') 
     .attr('x', function(d) { return x(d.x); }) 
     .attr('y', function(d) { return y(d.y); }) 
     .attr('height', function(d) { return d.value; }) 
     .attr('width', function(d) { return 3 }); 
} 

jsfiddle : 당신의 업데이트 방법 http://jsfiddle.net/BU8cA/

+0

(http://jsfiddle.net/) 또는 plunkr http://plnkr.co/edit/?p=catalogue 이슈를 실시간으로 보는데 도움이 될 것입니다. –

+0

복사/붙여 넣기 문제인지는 모르겠지만 y 다음에 ")"가 누락되었습니다 (dy on the y attr이고 그 오류가 – tomtomtom

+0

일 수 있습니다. @tomtomtom 복사 붙여 넣기 문제가 발생했습니다. 오타를 수정했습니다. – Nyxynyx

답변

11

문제는 만 새로운 요소를 처리하고 새로운 데이터와 일치하는 기존 요소를 업데이트하지 않습니다. Enter() 선택 항목으로 새 사각형을 만든 후에는 변경하려는 속성을 설정하기 위해 전체 선택 항목 (새 사각형 및 변경된 사각형)으로 돌아 가야합니다.

var rects = chart.selectAll('rect') 
     .data(data); 

    rects.enter() 
     .append('svg:rect') 
     .attr('width', function(d) { return 3 }); 
     // since the width is constant, you only need to set it once 

    rects.exit().remove(); //if the number of data points might shrink 

    rects.attr('x', function(d) { return x(d.x); }) 
     .attr('y', function(d) { return y(d.y); }) 
     .attr('height', function(d) { return d.value; }); 
    //note that this now includes the rectangles created with enter() 
    //as well as the old ones you are resizing/repositioning 

을 얻을 것을 :

이 작업을 수행하는 가장 쉬운 방법은 데이터 기능을 적용한 점에서 변수에 선택을 저장하지만 호출하기 전에이 같은 방법을 입력하는 것입니다 오른쪽 데이터가 들어 있지만 y 값이 올바르게 설정되지 않았다는 이유로 레이아웃 문제 (여하튼 바이올린에서)가 발생했습니다. y 값은 직사각형 상단의 위치입니다. 따라서 막대가 모두 같은 선상에있는 것처럼 보이게하려면 막대의 높이를 기준으로 막대를 조정해야합니다. 마이크 Bostock의 튜토리얼 및 데모 여기 : D3 버전은 "입력"선택에 추가 4+

요소에 대한 http://bost.ocks.org/mike/bar/3/


업데이트는 더 이상 자동으로 주 (갱신) 선택에 추가되지 않습니다. 이제 명시 적으로 "입력"선택에 merge 메소드를 호출하는 "병합"선택을 만들어야합니다

var rects = chart.selectAll('rect') 
    .data(data); 

rects.exit().remove(); //if the number of data points might shrink 

rects.enter() 
    .append('svg:rect') 
    .attr('width', function(d) { return 3 }) // since the width is constant, you only need to set it once 

    .merge(rects) 
      //merge the newly added elements into the main selection 
      //of existing elements to update 
    .attr('x', function(d) { return x(d.x); }) 
    .attr('y', function(d) { return y(d.y); }) 
    .attr('height', function(d) { return d.value; }); 
당신이 바이올린을 포함 할 경우 더 나은 것
+0

이 대답은 유효합니까? rects.enter(). append()를 호출 한 후 rects.nodes()를 호출하면 여전히 빈 배열이 반환됩니다. "이것은 이제 enter()로 생성 된 사각형을 포함합니다."라는 위의 주장이 사실이라면, .nodes()에 대한 호출에서 빈 배열이 아니라 채워진 배열을 볼 것으로 예상해야합니까? – MattEvansDev

+1

@ mevans D3 v4를 사용하고 있습니까? 그것은 병합이 어떻게 바뀌 었는지를 보여줍니다. [Mike Bostock의 변경 추론에 대한 개요] (https://medium.com/@mbostock/what-makes-software-good-943557f8a488). 이제 입력과 업데이트 선택을 결합하기 위해 명시 적으로'selection.merge()'를 호출해야합니다. – AmeliaBR

+0

예 - D3 v4를 사용 중입니다. .merge()의 도입과 입력/업데이트 (이제는 웹에있는 대부분의 예제와 상반되는 기능) 변경으로 인해 큰 어려움이있었습니다. 설명을 해주셔서 너무 고마워요. – MattEvansDev

관련 문제