d3 버블 다이어그램에서 원을 조작하는 방법은 무엇입니까?

매튜 롤러 스

어리석은 질문에 대해 죄송합니다. 저는 단지 가난한 d3 초보자입니다 ...

JSFiddle에 다음과 같은 데모 버블 다이어그램 이 있습니다. 제가 달성하려는 것은 원을 클릭 할 때마다 원의 반경을 늘리고 그에 따라 팩 레이아웃을 조정하는 것입니다.

편의를 위해 JSFiddle의 코드는 다음과 같습니다.

text {
  font: 20px sans-serif;
}
<!DOCTYPE html>

<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script>
        
var root = {
    "name": "Root",
    "children": [
        {
            "name": "Leaf One",
            "children": null,
            "size": 1
        },
        {
            "name": "Leaf Two",
            "children": null,
            "size": 1
        },
        {
            "name": "Leaf Three",
            "children": null,
            "size": 1
        }
    ],
    "size": 1
};

    
var diameter = 400,
    format = d3.format(",d"),
    color = d3.scale.category20c();

var bubble = d3.layout.pack()
    .sort(null)
    .size([diameter, diameter])
    .padding(1.5);

var svg = d3.select("body").append("svg")
    .attr("width", diameter)
    .attr("height", diameter)
    .attr("class", "bubble");

// not needed in JSfiddle, data is hard-coded:
// d3.json("data.json", function(error, root) {
//   if (error) throw error;

  var node = svg.selectAll(".node")
      .data(bubble.nodes(classes(root))
      .filter(function(d) { return !d.children; }))
    .enter().append("g")
      .attr("class", "node")
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

  node.append("title")
      .text(function(d) { return d.className + ": " + format(d.value); });

  node.append("circle")
      .attr("r", function(d) { return d.r; })
      .style("fill", function(d) { return color(d.packageName); });

  node.append("text")
      .attr("dy", ".3em")
      .style("text-anchor", "middle")
      .text(function(d) { return d.className.substring(0, d.r / 3); });
    
    node.on("click", function(e, i){
  		var circle = svg.select("circle");
  		circle.attr("value", function(d) { 
  			d.value += 1;
  			return d.value; 
  		});
  		circle.attr("r", function(d) { 
  			d.r += 1.0;
  			return d.r; 
  		});
      });
// });

// Returns a flattened hierarchy containing all leaf nodes under the root.
function classes(root) {
  var classes = [];

  function recurse(name, node) {
    if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
    else classes.push({packageName: name, className: node.name, value: node.size});
  }

  recurse(null, root);
  return {children: classes};
}

d3.select(self.frameElement).style("height", diameter + "px");

</script>

나는 node.on("click", ...)방법 을 통해 그것을 시도했지만 수정 된 원이 항상 첫 번째이기 때문에 어떻게 든 막혔습니다. 클릭 한 원을 선택하는 가장 좋은 방법은 무엇입니까?

또한 원 반경을 수정 한 후 d3 팩 레이아웃을 강제로 새로 고치려면 어떻게해야합니까?

Eagor

먼저, 이벤트 핸들러 this에서는 현재 DOM 요소에 바인딩되어 있음을 기억해야합니다 (아웃 케이스-the <g>). 클릭 <g>하여 d3.select(this)를 선택한 다음 다음에서 원을 선택할 수 있습니다.

var circle = d3.select(this).select("circle");

(그냥 svg.select("circle")DOM의 첫 번째 원을 선택하면 항상 같은 원이됩니다)

레이아웃새로 고치려면 기본 데이터를 업데이트하고, 레이아웃을 다시 계산하고, 데이터 결합을 다시 계산하고, 값을 업데이트해야합니다.

// store the underlying data in a value
var classedRoot = classes(root);

// ...your node creating code here

node.on("click", function(d) {
   // update the data in classedRoot
   d.value += 1;

   // recalculate layout
   var data = bubble.nodes(classedRoot);

   // recompute data join
   node.data(data, function(d) { return d.className; }) // use key function
      // update values
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
      .select("circle")
      .attr("r", function(d) { return d.r });
});

여기에서 키 기능을 사용하여 업데이트 된 데이터를 이미 존재하는 원과 적절하게 바인딩합니다. 사용하는 값은 모든 서클에 대해 고유해야합니다. 여기서는 className을 사용 했지만 고유하지 않은 경우 일종의 Id를 사용해야합니다.

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

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

D3 버블 차트 / 팩 레이아웃-가장 큰 버블에서 가장 작은 버블로 버블을 방출하는 방법은 무엇입니까?

분류에서Dev

JSON 파일에서 D3 JS 햇살 다이어그램에 색상을 추가하는 방법은 무엇입니까?

분류에서Dev

D3 차트에서 xaxis 레이블을 변경하는 방법은 무엇입니까?

분류에서Dev

jquery에서 ul 및 li의 블록 다이어그램을 만드는 방법은 무엇입니까?

분류에서Dev

d3에서 NaN 값을 확인하는 방법은 무엇입니까?

분류에서Dev

d3.js를 사용하여 버튼 테이블 열을 추가하는 방법은 무엇입니까?

분류에서Dev

d3로 그린 SVG지도에 국가 이름 레이블을 표시하는 방법은 무엇입니까?

분류에서Dev

D3에서 레이블과 노드를 강제로 레이아웃을 클릭하여 URL로 이동하는 방법은 무엇입니까?

분류에서Dev

d3의 노드에 그려진 파이에 마우스 호버 속성을 추가하는 방법은 무엇입니까?

분류에서Dev

Ruby에서 원격 / 로컬 서버 파일 조작 방법을보다 효율적으로 작성하는 방법은 무엇입니까?

분류에서Dev

Swift 3에서 Tableviewcell을 버블로 표시하는 방법은 무엇입니까?

분류에서Dev

D3 꺾은 선형 차트에 대화 형 기능 (선 및 레이블)을 추가하는 방법은 무엇입니까?

분류에서Dev

d3에서 드래그 가능한 영역을 제한하는 방법은 무엇입니까?

분류에서Dev

Elm 버전 0.18.0에서 원을 그리는 방법은 무엇입니까?

분류에서Dev

D3에서 원형 차트의 위치를 변경하는 방법은 무엇입니까?

분류에서Dev

Python 패키지를 버전 3으로 만 레이블을 지정하는 방법은 무엇입니까?

분류에서Dev

SQL에서 3 개 이상의 테이블을 조인하는 방법은 무엇입니까?

분류에서Dev

SQL에서 3 개 이상의 테이블을 조인하는 방법은 무엇입니까?

분류에서Dev

d3에서 아무것도 선택하지 않은 경우 모든 원을 표시하는 방법은 무엇입니까?

분류에서Dev

색조 조정을 수행하고 룩업 테이블을 작성하는 방법은 무엇입니까?

분류에서Dev

PYQT에서 레이블 버튼을 만드는 방법은 무엇입니까?

분류에서Dev

D3에서 타이머로 전환을 사용하는 방법은 무엇입니까?

분류에서Dev

먼지 도우미에서 d3 기능을 제공하는 좋은 방법은 무엇입니까?

분류에서Dev

D3 : 입력 요소 뒤에 레이블 텍스트를 만드는 방법은 무엇입니까?

분류에서Dev

d3에서 값을 업데이트 할 때 원형 차트에서 부드럽게 전환하는 방법은 무엇입니까?

분류에서Dev

MySQL 다이어그램보기에서 검사 제약 조건을 만드는 방법은 무엇입니까?

분류에서Dev

배열로 MySQL 테이블을 복원하는 방법은 무엇입니까?

분류에서Dev

두 버전의 테이블을 병합하는 방법은 무엇입니까?

분류에서Dev

분류 작업에서 레이블의 등급 편향을 조정하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    D3 버블 차트 / 팩 레이아웃-가장 큰 버블에서 가장 작은 버블로 버블을 방출하는 방법은 무엇입니까?

  2. 2

    JSON 파일에서 D3 JS 햇살 다이어그램에 색상을 추가하는 방법은 무엇입니까?

  3. 3

    D3 차트에서 xaxis 레이블을 변경하는 방법은 무엇입니까?

  4. 4

    jquery에서 ul 및 li의 블록 다이어그램을 만드는 방법은 무엇입니까?

  5. 5

    d3에서 NaN 값을 확인하는 방법은 무엇입니까?

  6. 6

    d3.js를 사용하여 버튼 테이블 열을 추가하는 방법은 무엇입니까?

  7. 7

    d3로 그린 SVG지도에 국가 이름 레이블을 표시하는 방법은 무엇입니까?

  8. 8

    D3에서 레이블과 노드를 강제로 레이아웃을 클릭하여 URL로 이동하는 방법은 무엇입니까?

  9. 9

    d3의 노드에 그려진 파이에 마우스 호버 속성을 추가하는 방법은 무엇입니까?

  10. 10

    Ruby에서 원격 / 로컬 서버 파일 조작 방법을보다 효율적으로 작성하는 방법은 무엇입니까?

  11. 11

    Swift 3에서 Tableviewcell을 버블로 표시하는 방법은 무엇입니까?

  12. 12

    D3 꺾은 선형 차트에 대화 형 기능 (선 및 레이블)을 추가하는 방법은 무엇입니까?

  13. 13

    d3에서 드래그 가능한 영역을 제한하는 방법은 무엇입니까?

  14. 14

    Elm 버전 0.18.0에서 원을 그리는 방법은 무엇입니까?

  15. 15

    D3에서 원형 차트의 위치를 변경하는 방법은 무엇입니까?

  16. 16

    Python 패키지를 버전 3으로 만 레이블을 지정하는 방법은 무엇입니까?

  17. 17

    SQL에서 3 개 이상의 테이블을 조인하는 방법은 무엇입니까?

  18. 18

    SQL에서 3 개 이상의 테이블을 조인하는 방법은 무엇입니까?

  19. 19

    d3에서 아무것도 선택하지 않은 경우 모든 원을 표시하는 방법은 무엇입니까?

  20. 20

    색조 조정을 수행하고 룩업 테이블을 작성하는 방법은 무엇입니까?

  21. 21

    PYQT에서 레이블 버튼을 만드는 방법은 무엇입니까?

  22. 22

    D3에서 타이머로 전환을 사용하는 방법은 무엇입니까?

  23. 23

    먼지 도우미에서 d3 기능을 제공하는 좋은 방법은 무엇입니까?

  24. 24

    D3 : 입력 요소 뒤에 레이블 텍스트를 만드는 방법은 무엇입니까?

  25. 25

    d3에서 값을 업데이트 할 때 원형 차트에서 부드럽게 전환하는 방법은 무엇입니까?

  26. 26

    MySQL 다이어그램보기에서 검사 제약 조건을 만드는 방법은 무엇입니까?

  27. 27

    배열로 MySQL 테이블을 복원하는 방법은 무엇입니까?

  28. 28

    두 버전의 테이블을 병합하는 방법은 무엇입니까?

  29. 29

    분류 작업에서 레이블의 등급 편향을 조정하는 방법은 무엇입니까?

뜨겁다태그

보관