亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

D3.js v5 構建樹“矩陣”

D3.js v5 構建樹“矩陣”

HUWWW 2023-11-02 20:06:03
目標是以矩陣的形式優雅地附加多個小樹圖。我已經準備了預期輸出的簡單版本;矩形和文本顯示了圖案應該是什么樣子。接下來需要做的是在矩形下方添加一個簡單的兩級樹圖。我正在使用一種數據結構,其中樹數據存儲在對象數組的每個項目內的對象中:  var data = [    {name:"jackie chan", tree: {      "name": "Top Level",      "children": [            { "name": "Fund 1" },            { "name": "Fund 2" },            { "name": "Fund 3"}          ]    }},    {name:"jet li", tree: {      "name": "Top Level",      "children": [            { "name": "Fund 1" },            { "name": "Fund 2" },            { "name": "Fund 3"},            { "name": "Fund 4"},          ]    }},...我認為我可以通過將所有樹方法封裝到一個大數據調用中來實現所需的結果,然后使用與代碼片段結果中所示相同的方法來附加矩形和文本:pmG.selectAll(null)    .data( function(d) {return miniTree(d3.hierarchy(d.tree).descendants().slice(1))})  .enter().append("path")    .attr("class", "link")    .attr("d", function(d) {       return "M" + d.x + "," + d.y         + "C" + d.x + "," + (d.y + d.parent.y) / 2         + " " + d.parent.x + "," +  (d.y + d.parent.y) / 2         + " " + d.parent.x + "," + d.parent.y;       });但是我得到了錯誤:未捕獲的類型錯誤:i.eachBefore 不是函數我以前從未見過這種錯誤,我擔心會出現大問題。問題基于我的矩陣框架(查看如何在片段中附加矩形和文本),如何以類似的方式附加小“迷你樹”?
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

您在制作樹時遇到錯誤:

 .data( function(d) {return miniTree(d3.hierarchy(d.tree).descendants().slice(1)) })

應該:

 .data( function(d) {return miniTree(d3.hierarchy(d.tree)).descendants().slice(1)  })

你不想要 d3.hierarchy 的后代,但是 miniTree - 我第一次查看它時錯過了它。

var margins = {top:100, bottom:300, left:100, right:100};


var height = 600;

var width = 900;


var totalWidth = width+margins.left+margins.right;

var totalHeight = height+margins.top+margins.bottom;


var svg = d3.select('body')

.append('svg')

.attr('width', totalWidth)

.attr('height', totalHeight);


var graphGroup = svg.append('g')

.attr('transform', "translate("+margins.left+","+margins.top+")");


  var data = [

    {name:"jackie chan", tree: {

      "name": "Top Level",

      "children": [

            { "name": "Fund 1" },

            { "name": "Fund 2" },

            { "name": "Fund 3"}

          ]

    }},

    {name:"jet li", tree: {

      "name": "Top Level",

      "children": [

            { "name": "Fund 1" },

            { "name": "Fund 2" },

            { "name": "Fund 3"},

            { "name": "Fund 4"},

          ]

    }},

    {name:"donnie yen", tree: {

      "name": "Top Level",

      "children": [

            { "name": "Fund 1" },

            { "name": "Fund 2" },

          ]

    }},

    {name:"chow yun fat", tree: {

      "name": "Top Level",

      "children": [

            { "name": "Fund 1" },

            { "name": "Fund 2" },

            { "name": "Fund 3"},

            { "name": "Fund 4"},

            { "name": "Fund 5"},

          ]

    }},

  ];


  //var formatComma = d3.format(",");


  var columns = 3;

  var spacing = 150;

  var vSpacing = 180;


  var pmG = graphGroup.selectAll('.pm')

    .data(data)

    .enter()

    .append('g')

    .attr('class', 'pm')

    .attr('id', (d, i) => 'pm' + i)

    .attr('transform', (d, k) => {

      var horSpace = (k % columns) * spacing;

      var vertSpace = ~~((k / columns)) * vSpacing;

      return "translate(" + horSpace + "," + vertSpace + ")";

    });


var miniTree = d3.tree()

    .size([150, 75]);


pmG.append('rect')

    .attr('x',0)

    .attr('y',0)

    .attr('width',100)

    .attr('height',25)

    .style('fill',"#003366");


pmG.append('text')

    .attr('x',50)

    .attr('y',-10)

    .attr('text-anchor','middle')

    .text(function(d) {return d.name});



pmG.selectAll(null)

    .data( function(d) { 

        return miniTree(d3.hierarchy(d.tree)).descendants().slice(1) 

        

        })

  .enter().append("path")

    .attr("transform", "translate(-25,20)") // extra positioning.

    .attr("class", "link")

    .attr("d", function(d) {

       return "M" + d.x + "," + d.y

         + "C" + d.x + "," + (d.y + d.parent.y) / 2

         + " " + d.parent.x + "," +  (d.y + d.parent.y) / 2

         + " " + d.parent.x + "," + d.parent.y;

       });


pmG.selectAll(null)

    .data( function(d) {return miniTree(d3.hierarchy(d.tree)).descendants() })

  .enter().append("g")

    .attr("class", function(d) {

      return "node" +

        (d.children ? " node--internal" : " node--leaf"); })

    .attr("transform", function(d) {

      return "translate(" + (d.x - 25) + "," + (d.y+20) + ")"; }) // with extra positioning.

      .append("circle")

path {

  stroke-width: 1px;

  fill: none;

  stroke: #003366;

}


circle {

  r: 5px;

  fill: #003366;

}

<script src="https://d3js.org/d3.v5.min.js"></script>


查看完整回答
反對 回復 2023-11-02
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號