如何在d3js中垂直树

Posted

技术标签:

【中文标题】如何在d3js中垂直树【英文标题】:how to vertical the tree in d3js 【发布时间】:2016-12-21 15:47:40 【问题描述】:

我目前正在研究由 d3.js 创建的树,我发现了一个非常有用的示例,但我想出了一种使树垂直的方法,这是我的代码。

<div class="dashboard-block-content" >
    <style>

    .node circle 
      fill: #fff;
      stroke: steelblue;
      stroke-width: 1.5px;
    

    .node 
      font: 10px sans-serif;
    

    .link 
      fill: none;
      stroke: #ccc;
      stroke-width: 1.5px;
    

    </style>
    <script src="//d3js.org/d3.v3.min.js"></script>
    <script>
    var treeData = [
      'name' : 'CDS','icon': '../image/logo.png','user_id': 'CDS','level':'CDS','children' : ['name' : 'Yap Cheng Wei','icon': '../image/seniorsniper.png','user_id': '1','level':'Senior Sniper','children' : ['name' : 'woon cai cai','icon': '../image/prosniper.png','user_id': '2','level':'Pro Sniper','children' : ['name' : 'tan kiang kiong','icon': '../image/prosniper.png','user_id': '7','level':'Pro Sniper','children' : ['name' : 'koo hou wai','icon': '../image/seniorsniper.png','user_id': '19','level':'Senior Sniper','children' : ['name' : 'Gan Jiang Han','icon': '../image/sniper.png','user_id': '50','level':'Sniper','children' : ['name' : 'Jenny Lim  ','icon': '../image/sniper.png','user_id': '80','level':'Sniper','children' : [],'name' : 'Low Jia Sheng','icon': '../image/sniper.png','user_id': '81','level':'Sniper','children' : [],'name' : 'See Jia Min','icon': '../image/sniper.png','user_id': '82','level':'Sniper','children' : []],'name' : 'Lim Di er','icon': '../image/sniper.png','user_id': '51','level':'Sniper','children' : ['name' : 'Tan Jie Ying','icon': '../image/sniper.png','user_id': '83','level':'Sniper','children' : [],'name' : 'lim jo yun','icon': '../image/sniper.png','user_id': '84','level':'Sniper','children' : [],'name' : 'kok mei kuan','icon': '../image/sniper.png','user_id': '85','level':'Sniper','children' : []],'name' : 'Tiu Zhi Jian','icon': '../image/sniper.png','user_id': '52','level':'Sniper','children' : ['name' : 'Kam Hui Yin','icon': '../image/sniper.png','user_id': '86','level':'Sniper','children' : [],'name' : 'Chua Mei Xuan','icon': '../image/sniper.png','user_id': '87','level':'Sniper','children' : [],'name' : 'Tan Mei Ke','icon': '../image/sniper.png','user_id': '88','level':'Sniper','children' : []]],'name' : 'Zheng Yu cheng','icon': '../image/seniorsniper.png','user_id': '24','level':'Senior Sniper','children' : ['name' : 'Gan De Huat','icon': '../image/sniper.png','user_id': '53','level':'Sniper','children' : ['name' : 'Tan Mei Mei','icon': '../image/sniper.png','user_id': '89','level':'Sniper','children' : [],'name' : 'Ng li ling','icon': '../image/sniper.png','user_id': '90','level':'Sniper','children' : [],'name' : 'Chan Li Sen','icon': '../image/sniper.png','user_id': '91','level':'Sniper','children' : []],'name' : 'Gan Wei Ping','icon': '../image/sniper.png','user_id': '54','level':'Sniper','children' : ['name' : 'Wong Ka Wai','icon': '../image/sniper.png','user_id': '92','level':'Sniper','children' : [],'name' : 'Tan Li Hui','icon': '../image/sniper.png','user_id': '93','level':'Sniper','children' : [],'name' : 'Tan Mei Wen','icon': '../image/sniper.png','user_id': '94','level':'Sniper','children' : []],'name' : 'Teoh Ha Ze','icon': '../image/sniper.png','user_id': '55','level':'Sniper','children' : ['name' : 'Yap Sally ','icon': '../image/sniper.png','user_id': '95','level':'Sniper','children' : [],'name' : 'Yap Shan ee','icon': '../image/sniper.png','user_id': '96','level':'Sniper','children' : [],'name' : 'Lim Shen Ni','icon': '../image/sniper.png','user_id': '97','level':'Sniper','children' : []]],'name' : 'Goh Xue ling','icon': '../image/seniorsniper.png','user_id': '25','level':'Senior Sniper','children' : ['name' : 'Tee Hui Qi','icon': '../image/sniper.png','user_id': '56','level':'Sniper','children' : ['name' : 'Soh Xie Wei','icon': '../image/sniper.png','user_id': '98','level':'Sniper','children' : [],'name' : 'Soh hui su','icon': '../image/sniper.png','user_id': '99','level':'Sniper','children' : [],'name' : 'Tan Wei Xin','icon': '../image/sniper.png','user_id': '100','level':'Sniper','children' : []],'name' : 'Teh Isa Bella','icon': '../image/sniper.png','user_id': '57','level':'Sniper','children' : ['name' : 'Chew wa sa','icon': '../image/sniper.png','user_id': '101','level':'Sniper','children' : [],'name' : 'vicky chang  ','icon': '../image/sniper.png','user_id': '102','level':'Sniper','children' : [],'name' : 'Tan Jia Ler','icon': '../image/sniper.png','user_id': '103','level':'Sniper','children' : []],'name' : 'Koo Jia Ren','icon': '../image/sniper.png','user_id': '58','level':'Sniper','children' : ['name' : 'Lim Xiao Enn','icon': '../image/sniper.png','user_id': '104','level':'Sniper','children' : [],'name' : 'Ang Jia Yan','icon': '../image/sniper.png','user_id': '105','level':'Sniper','children' : [],'name' : 'lee Yi Jia','icon': '../image/sniper.png','user_id': '106','level':'Sniper','children' : []]],'name' : 'Jasmine Koh  ','icon': '../image/sniper.png','user_id': '26','level':'Sniper','children' : []],'name' : 'tan li li','icon': '../image/seniorsniper.png','user_id': '8','level':'Senior Sniper','children' : ['name' : 'lee kai wen','icon': '../image/sniper.png','user_id': '20','level':'Sniper','children' : ['name' : 'tan Jia Huan','icon': '../image/sniper.png','user_id': '59','level':'Sniper','children' : [],'name' : 'Trista tan  ','icon': '../image/sniper.png','user_id': '60','level':'Sniper','children' : [],'name' : 'teyo zhe wee','icon': '../image/sniper.png','user_id': '61','level':'Sniper','children' : []],'name' : 'Wong Ja mu','icon': '../image/sniper.png','user_id': '27','level':'Sniper','children' : ['name' : 'Gan Wei Yi','icon': '../image/sniper.png','user_id': '62','level':'Sniper','children' : [],'name' : 'Zhou Zheng Hong','icon': '../image/sniper.png','user_id': '63','level':'Sniper','children' : [],'name' : 'Tan Yuan Shan','icon': '../image/sniper.png','user_id': '64','level':'Sniper','children' : []],'name' : 'Aw jing yang','icon': '../image/sniper.png','user_id': '28','level':'Sniper','children' : ['name' : 'Tan Se Te','icon': '../image/sniper.png','user_id': '65','level':'Sniper','children' : [],'name' : 'Tan Xin Yee','icon': '../image/sniper.png','user_id': '66','level':'Sniper','children' : [],'name' : 'Hor Yan Qi','icon': '../image/sniper.png','user_id': '67','level':'Sniper','children' : []],'name' : 'Sim shi ying','icon': '../image/sniper.png','user_id': '29','level':'Sniper','children' : []],'name' : 'yap boon hua','icon': '../image/sniper.png','user_id': '9','level':'Sniper','children' : ['name' : 'Ng hui yin','icon': '../image/sniper.png','user_id': '21','level':'Sniper','children' : []],'name' : 'tan li fun','icon': '../image/seniorsniper.png','user_id': '10','level':'Senior Sniper','children' : ['name' : 'Tan  Xiao  Wei','icon': '../image/sniper.png','user_id': '30','level':'Sniper','children' : ['name' : 'Yap Sheng zhi','icon': '../image/sniper.png','user_id': '68','level':'Sniper','children' : [],'name' : 'Tan Yu Le','icon': '../image/sniper.png','user_id': '69','level':'Sniper','children' : [],'name' : 'Yang Gong jun','icon': '../image/sniper.png','user_id': '70','level':'Sniper','children' : []],'name' : 'Tee Swee Kiam','icon': '../image/sniper.png','user_id': '31','level':'Sniper','children' : ['name' : 'teoh hui qing','icon': '../image/sniper.png','user_id': '71','level':'Sniper','children' : [],'name' : 'Tan li na','icon': '../image/sniper.png','user_id': '72','level':'Sniper','children' : [],'name' : 'Zhong ming zhen','icon': '../image/sniper.png','user_id': '73','level':'Sniper','children' : []],'name' : 'Tee Siao Lun','icon': '../image/sniper.png','user_id': '32','level':'Sniper','children' : ['name' : 'Tee ker sin','icon': '../image/sniper.png','user_id': '74','level':'Sniper','children' : [],'name' : 'loh na na','icon': '../image/sniper.png','user_id': '75','level':'Sniper','children' : [],'name' : 'tee pei ssu','icon': '../image/sniper.png','user_id': '76','level':'Sniper','children' : []]],'name' : 'koh aik lee','icon': '../image/sniper.png','user_id': '11','level':'Sniper','children' : [],'name' : 'woon yi ting','icon': '../image/sniper.png','user_id': '12','level':'Sniper','children' : [],'name' : 'Koh jin yi','icon': '../image/sniper.png','user_id': '13','level':'Sniper','children' : ['name' : 'Tan Sheao Wei','icon': '../image/sniper.png','user_id': '46','level':'Sniper','children' : [],'name' : 'wong lian may','icon': '../image/sniper.png','user_id': '47','level':'Sniper','children' : [],'name' : 'Angie Tan  ','icon': '../image/sniper.png','user_id': '48','level':'Sniper','children' : []],'name' : 'George Lim  ','icon': '../image/sniper.png','user_id': '23','level':'Sniper','children' : [],'name' : 'Leong yong wa','icon': '../image/sniper.png','user_id': '34','level':'Sniper','children' : [],'name' : 'Yoong Sze Jiat','icon': '../image/sniper.png','user_id': '35','level':'Sniper','children' : [],'name' : 'yvvonne ggo ','icon': '../image/sniper.png','user_id': '36','level':'Sniper','children' : [],'name' : 'ee wee hao','icon': '../image/sniper.png','user_id': '37','level':'Sniper','children' : [],'name' : 'chua wee hao','icon': '../image/sniper.png','user_id': '38','level':'Sniper','children' : [],'name' : 'Chia Ya li','icon': '../image/sniper.png','user_id': '39','level':'Sniper','children' : [],'name' : 'Hussein Abdi ','icon': '../image/sniper.png','user_id': '49','level':'Sniper','children' : [],'name' : 'Gan Jia Yun','icon': '../image/sniper.png','user_id': '77','level':'Sniper','children' : [],'name' : 'Lim Leon ','icon': '../image/sniper.png','user_id': '78','level':'Sniper','children' : [],'name' : 'Tan Kristine ','icon': '../image/sniper.png','user_id': '79','level':'Sniper','children' : []],'name' : 'kenny lim eng  sheng','icon': '../image/sniper.png','user_id': '5','level':'Sniper','children' : ['name' : 'Tan Re Dai','icon': '../image/sniper.png','user_id': '17','level':'Sniper','children' : [],'name' : 'Ong Kelvin ','icon': '../image/sniper.png','user_id': '40','level':'Sniper','children' : [],'name' : 'Loo Ai Vee','icon': '../image/sniper.png','user_id': '41','level':'Sniper','children' : [],'name' : 'Sok sui sui','icon': '../image/sniper.png','user_id': '42','level':'Sniper','children' : []],'name' : 'REDACTED','icon': '../image/sniper.png','user_id': '6','level':'Sniper','children' : ['name' : 'Ooi Zi yin','icon': '../image/sniper.png','user_id': '18','level':'Sniper','children' : [],'name' : 'Yeoh Pai See','icon': '../image/sniper.png','user_id': '43','level':'Sniper','children' : [],'name' : 'wong ka mee','icon': '../image/sniper.png','user_id': '44','level':'Sniper','children' : [],'name' : 'Koh li on','icon': '../image/sniper.png','user_id': '45','level':'Sniper','children' : []],'name' : 'wong siong xie','icon': '../image/sniper.png','user_id': '14','level':'Sniper','children' : []],'name' : 'koh wei  hao','icon': '../image/sniper.png','user_id': '3','level':'Sniper','children' : ['name' : 'wu  xie','icon': '../image/sniper.png','user_id': '15','level':'Sniper','children' : []],'name' : 'Yap Zhan Wei','icon': '../image/sniper.png','user_id': '4','level':'Sniper','children' : ['name' : 'Jing teng xing xing','icon': '../image/sniper.png','user_id': '16','level':'Sniper','children' : []],'name' : 'Seow Ai Lyn','icon': '../image/sniper.png','user_id': '22','level':'Sniper','children' : [],'name' : 'Lee guan ling','icon': '../image/sniper.png','user_id': '33','level':'Sniper','children' : [],'name' : 'Jason Chan Keat Hwee','icon': '../image/sniper.png','user_id': '107','level':'Sniper','children' : [],'name' : 'Chan Keat Hwee','icon': '../image/sniper.png','user_id': '108','level':'Sniper','children' : [],'name' : 'Tan Bao Bao','icon': '../image/sniper.png','user_id': '110','level':'Sniper','children' : [],'name' : 'yap xue wei','icon': '../image/sniper.png','user_id': '111','level':'Sniper','children' : []]          ];

    var width = 960,
        height = 2200;

    var cluster = d3.layout.tree()
        .size([height, width - 160]);

    var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height)
      .append("g")
        .attr("transform", "translate(40,0)");
        root = treeData[0];
      var nodes = cluster.nodes(root).reverse();

      var link = svg.selectAll(".link")
          .data(cluster.links(nodes))
        .enter().append("path")
          .attr("class", "link")
          .attr("d", elbow);

      var node = svg.selectAll(".node")
          .data(nodes)
        .enter().append("g")
          .attr("class", "node")
          .attr("transform", function(d)  return "translate(" + d.y + "," + d.x + ")"; )

      node.append("circle")
          .attr("r", 4.5);

      node.append("text")
          .attr("dy", 3)
          .attr("dx", function(d)  return d.children ? -8 : 8; )
          .attr("text-anchor", function(d)  return d.children ? "end" : "start"; )
          .text(function(d)  return d.name; );

    function elbow(d, i) 
      return "M" + d.source.y + "," + d.source.x
          + "V" + d.target.x + "H" + d.target.y;
    

    </script>
    </div>

这是我找到的例子"Elbow" Dendrogram

【问题讨论】:

解释如下:bl.ocks.org/mbostock/3184089 我之前试过,是我想要的垂直树,但是对角线路径不是我想要的东西,我之前尝试过修改它,但结果很糟糕 【参考方案1】:

您只需要更改节点的变换和肘部功能。

var node = svg.selectAll(".node")
          .data(nodes)
        .enter().append("g")
          .attr("class", "node")
          .attr("transform", function(d)  return "translate(" + d.x + "," + d.y + ")"; );

function elbow(d, i) 
  return "M" + d.source.x + "," + d.source.y
      + "H" + d.target.x + "V" + d.target.y;

【讨论】:

以上是关于如何在d3js中垂直树的主要内容,如果未能解决你的问题,请参考以下文章

D3js:如何通过鼠标单击获取纬度/经度地理坐标?

如何从 d3js 中折叠的所有节点开始?

如何修改 d3js 鱼眼失真,使其支持半径

如何在d3js中沿x轴制作可滚动的轴/平移

在同一个 div 中渲染 Reactjs 多个“d3js”子组件

d3js:如何选择组的第 n 个元素?