D3 树布局可视化 - 继承具有多个父项的子项

2023-11-23

我是 D3 可视化的新鲜人。目前正在为数据沿袭创建 D3 树布局可视化。在数据沿袭流中,子节点可以从多个父节点派生。这是一个例子。在下面的示例中,“DevLead”可能与 2 名经理一起工作。

var data = [
     { "name": "Director", "parent": "null", "depth": 0 },
     { "name": "Manager1", "parent": "Director", "depth": 1 },
     { "name": "Manager2", "parent": "Director", "depth": 1 },
     { "name": "DevLead", "parent": "Manager1", "depth": 2 },
     { "name": "DevLead", "parent": "Manager2", "depth": 2 }
        ];

获取输出请参考下图。

Output

我希望看到“DevLead”子项应该只显示一个,并且应该有来自“Manager1”和“Manager2”的派生。任何人都可以帮忙解决这个问题吗?


D3 树布局并不完全支持多个父级

你能做什么?

  1. 使用网络图代替 - 缺点是节点定位 难的

    我有类似的要求并尝试构建类似的网络图 使用树形布局,但是当有很多节点时,它会变得混乱......
    你可以检查一下 代码笔

  2. 在树布局上使用 hack - 从其他节点绘制附加链接
    检查这个例子

  3. 另一个使用隐藏节点的黑客 -jsfiddle

另外,我认为这些链接将进一步帮助您:

  • d3.js 中的家谱

  • d-tree 库 - 具有多个父项的数据

如果您选择第一个选项,那么您可以通过删除和添加数据中的节点来使用此代码片段

<!DOCTYPE html>
<html >

<head>
  <meta charset="UTF-8">
  <link rel="shortcut icon" type="image/x-icon" href="https://production-assets.codepen.io/assets/favicon/favicon-8ea04875e70c4b0bb41da869e81236e54394d63638a1ef12fa558a4a835f1164.ico" />
  <link rel="mask-icon" type="" href="https://production-assets.codepen.io/assets/favicon/logo-pin-f2d2b6d2c61838f7e76325261b7195c27224080bc099486ddd6dccb469b8e8e6.svg" color="#111" />
  <title>CodePen - A Pen by  dato</title>
  
  
  
  
  
  
  
  
  
</head>

<body translate="no" >

  
  
  <script src='https://d3js.org/d3.v3.min.js'></script>

    <script>
    var width = window.innerWidth - 20,
  height = window.innerHeight - 20,
  radius = 30;

var min_zoom = 0.1;
var max_zoom = 7;

var zoom = d3.behavior.zoom().scaleExtent([min_zoom, max_zoom])

var fill = d3.scale.category20();

var force = d3.layout.force()

.charge(-8000)
  .linkDistance(200)

.size([width, height]);

force.drag().on("dragstart", dragstarted)

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

var chart = svg.append('g');

var json = {
  "nodes": [{
    "name": "node0"
  }, {
    "name": "node1"
  }, {
    "name": "node2"
  }, {
    "name": "node3"
  }, {
    "name": "node4"
  }, {
    "name": "node5"
  }, {
    "name": "node6"
  }, {
    "name": "node7"
  }, {
    "name": "node8"
  }, {
    "name": "node9"
  }, {
    "name": "node10"
  }, {
    "name": "node11"
  }, {
    "name": "node12"
  }, {
    "name": "node13"
  }, {
    "name": "node14"
  }, {
    "name": "node15"
  }, {
    "name": "node16"
  }, {
    "name": "node17"
  }, {
    "name": "node18"
  }, {
    "name": "node19"
  }, {
    "name": "node20"
  }, {
    "name": "node21"
  }, {
    "name": "node22"
  }, {
    "name": "node23"
  }, {
    "name": "node24"
  }, {
    "name": "node25"
  }, {
    "name": "node26"
  }, {
    "name": "node27"
  }, {
    "name": "node28"
  }, {
    "name": "node29"
  }, {
    "name": "node30"
  }, {
    "name": "node31"
  }, {
    "name": "node32"
  }, {
    "name": "node33"
  }, {
    "name": "node34"
  }, {
    "name": "node35"
  }, {
    "name": "node36"
  }, {
    "name": "node37"
  }, {
    "name": "node38"
  }, {
    "name": "node39"
  }, {
    "name": "node40"
  }, {
    "name": "node41"
  }, {
    "name": "node42"
  }, {
    "name": "node43"
  }, {
    "name": "node44"
  }, {
    "name": "node45"
  }, {
    "name": "node46"
  }, {
    "name": "node47"
  }, {
    "name": "node48"
  }, {
    "name": "node49"
  }, {
    "name": "node50"
  }, {
    "name": "node51"
  }, {
    "name": "node52"
  }, {
    "name": "node53"
  }, {
    "name": "node54"
  }, {
    "name": "node55"
  }, {
    "name": "node56"
  }, {
    "name": "node57"
  }, {
    "name": "node58"
  }, {
    "name": "node59"
  }, {
    "name": "node60"
  }, {
    "name": "node61"
  }, {
    "name": "node62"
  }, {
    "name": "node63"
  }, {
    "name": "node64"
  }, {
    "name": "node65"
  }, {
    "name": "node66"
  }, {
    "name": "node67"
  }, {
    "name": "node68"
  }, {
    "name": "node69"
  }, {
    "name": "node70"
  }, {
    "name": "node71"
  }, {
    "name": "node72"
  }, {
    "name": "node73"
  }, {
    "name": "node74"
  }, {
    "name": "node75"
  }, {
    "name": "node76"
  }, {
    "name": "node77"
  }, {
    "name": "node78"
  }, {
    "name": "node79"
  }, {
    "name": "node80"
  }, {
    "name": "node81"
  }, {
    "name": "node82"
  }, {
    "name": "node83"
  }, {
    "name": "node84"
  }, {
    "name": "node85"
  }, {
    "name": "node86"
  }, {
    "name": "node87"
  }, {
    "name": "node88"
  }, {
    "name": "node89"
  }, {
    "name": "node90"
  }, {
    "name": "node91"
  }, {
    "name": "node92"
  }, {
    "name": "node93"
  }, {
    "name": "node94"
  }, {
    "name": "node95"
  }, {
    "name": "node96"
  }, {
    "name": "node97"
  }, {
    "name": "node98"
  }, {
    "name": "node99"
  }],
  "links": [ {
    "source": 0,
    "target": 1
  }, {
    "source": 0,
    "target": 2
  }, {
    "source": 1,
    "target": 3
  }, {
    "source": 1,
    "target": 4
  }, {
    "source": 2,
    "target": 5
  }, {
    "source": 2,
    "target": 6
  }, {
    "source": 3,
    "target": 7
  }, {
    "source": 3,
    "target": 8
  }, {
    "source": 4,
    "target": 9
  }, {
    "source": 4,
    "target": 10
  }, {
    "source": 5,
    "target": 11
  }, {
    "source": 5,
    "target": 12
  }, {
    "source": 6,
    "target": 13
  }, {
    "source": 6,
    "target": 14
  }, {
    "source": 7,
    "target": 15
  }, {
    "source": 7,
    "target": 16
  }, {
    "source": 8,
    "target": 17
  }, {
    "source": 8,
    "target": 18
  }, {
    "source": 9,
    "target": 19
  }, {
    "source": 9,
    "target": 20
  }, {
    "source": 10,
    "target": 21
  }, {
    "source": 10,
    "target": 22
  }, {
    "source": 11,
    "target": 23
  }, {
    "source": 11,
    "target": 24
  }, {
    "source": 12,
    "target": 25
  }, {
    "source": 12,
    "target": 26
  }, {
    "source": 13,
    "target": 27
  }, {
    "source": 13,
    "target": 28
  }, {
    "source": 14,
    "target": 29
  }, {
    "source": 14,
    "target": 30
  }, {
    "source": 15,
    "target": 31
  }, {
    "source": 15,
    "target": 32
  }, {
    "source": 16,
    "target": 33
  }, {
    "source": 16,
    "target": 34
  }, {
    "source": 17,
    "target": 35
  }, {
    "source": 17,
    "target": 36
  }, {
    "source": 18,
    "target": 37
  }, {
    "source": 18,
    "target": 38
  }, {
    "source": 19,
    "target": 39
  }, {
    "source": 19,
    "target": 40
  }, {
    "source": 20,
    "target": 41
  }, {
    "source": 20,
    "target": 42
  }, {
    "source": 21,
    "target": 43
  }, {
    "source": 21,
    "target": 44
  }, {
    "source": 22,
    "target": 45
  }, {
    "source": 22,
    "target": 46
  }, {
    "source": 23,
    "target": 47
  }, {
    "source": 23,
    "target": 48
  }, {
    "source": 24,
    "target": 49
  }, {
    "source": 24,
    "target": 50
  }, {
    "source": 25,
    "target": 51
  }, {
    "source": 25,
    "target": 52
  }, {
    "source": 26,
    "target": 53
  }, {
    "source": 26,
    "target": 54
  }, {
    "source": 27,
    "target": 55
  }, {
    "source": 27,
    "target": 56
  }, {
    "source": 28,
    "target": 57
  }, {
    "source": 28,
    "target": 58
  }, {
    "source": 29,
    "target": 59
  }, {
    "source": 29,
    "target": 60
  }, {
    "source": 30,
    "target": 61
  }, {
    "source": 30,
    "target": 62
  }, {
    "source": 31,
    "target": 63
  }, {
    "source": 31,
    "target": 64
  }, {
    "source": 32,
    "target": 65
  }, {
    "source": 32,
    "target": 66
  }, {
    "source": 33,
    "target": 67
  }, {
    "source": 33,
    "target": 68
  }, {
    "source": 34,
    "target": 69
  }, {
    "source": 34,
    "target": 70
  }, {
    "source": 35,
    "target": 71
  }, {
    "source": 35,
    "target": 72
  }, {
    "source": 36,
    "target": 73
  }, {
    "source": 36,
    "target": 74
  }, {
    "source": 37,
    "target": 75
  }, {
    "source": 37,
    "target": 76
  }, {
    "source": 38,
    "target": 77
  }, {
    "source": 38,
    "target": 78
  }, {
    "source": 39,
    "target": 79
  }, {
    "source": 39,
    "target": 80
  }, {
    "source": 40,
    "target": 81
  }, {
    "source": 40,
    "target": 82
  }, {
    "source": 41,
    "target": 83
  }, {
    "source": 41,
    "target": 84
  }, {
    "source": 42,
    "target": 85
  }, {
    "source": 42,
    "target": 86
  }, {
    "source": 43,
    "target": 87
  }, {
    "source": 43,
    "target": 88
  }, {
    "source": 44,
    "target": 89
  }, {
    "source": 44,
    "target": 90
  }, {
    "source": 45,
    "target": 91
  }, {
    "source": 45,
    "target": 92
  }, {
    "source": 46,
    "target": 93
  }, {
    "source": 46,
    "target": 94
  }, {
    "source": 47,
    "target": 95
  }, {
    "source": 47,
    "target": 96
  }, {
    "source": 48,
    "target": 97
  }, {
    "source": 48,
    "target": 98
  }, {
    "source": 49,
    "target": 99
  },{
    "source": 0,
    "target": 99
  }]
}

var link = chart.selectAll("line")
  .data(json.links)
  .enter()
  .append("line")
  .attr("stroke", function(d) {
    return 'blue'
  })

var node = chart.selectAll("circle")
  .data(json.nodes)
  .enter().append("circle")
  .attr("r", radius - .75)
  .style("fill", function(d) {
    return fill(d.group);
  })
  .style("stroke", function(d) {
    return d3.rgb(fill(d.group)).darker();
  })
  .on('mouseover', d => console.log(d))

.call(force.drag);

function dragstarted() {
  d3.event.sourceEvent.stopPropagation();
}

zoom.on("zoom", function(d) {

  var evt = d3.event;
  debugger;
  /*
	var dcx = (window.innerWidth/2-d.x*zoom.scale());
	var dcy = (window.innerHeight/2-d.y*zoom.scale());
  */
  var dcx = evt.translate[0]
  var dcy = evt.translate[1]

  zoom.translate([dcx, dcy]);

  chart.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");;

});

force
  .nodes(json.nodes)
  .links(json.links)
  .on("tick", tick)
  .start();

svg.call(zoom)

function tick(e) {
console.log(e)
  var k = 6 * e.alpha;

  // Push sources up and targets down to form a weak tree.
  link
    .each(function(d,i) {
   
      d.source.y -= k * 60, d.target.y += k * 100;
    /*
    if(i%2==1){
       d.source.x -=  0.4/k  
    }else{
        d.source.x +=  0.4/k  
    }
    */
    
    })
    .attr("x1", function(d) {
      return d.source.x;
    })
    .attr("y1", function(d) {
      return d.source.y;
    })
    .attr("x2", function(d) {
      return d.target.x;
    })
    .attr("y2", function(d) {
      return d.target.y;
    });

  node
    .attr("cx", function(d) {
      return d.x;
    })
    .attr("cy", function(d) {
      return d.y;
    });

}
  </script>

  
  

</body>
</html>
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3 树布局可视化 - 继承具有多个父项的子项 的相关文章

  • 在 WPF 中展开 TreeView 时显示“请稍候...”消息

    我的 TreeView 中有很多项目 而且项目也非常复杂 我不想使用虚拟化 展开 TreeView 有时需要花费大量时间 因此 是否有任何事件 例如 IsTreeViewExpanding 或类似的事件 我可以在其中显示 正在生成 Tree
  • 为什么这个标题图形不随世界更新

    对于以下内容 我很高兴组合框默认为世界 但当收音机被点击时 我也希望标题移回 世界 我该怎么做 我有这个笨蛋 http plnkr co edit 9FXJXVqLZLPFdDrmVJez p preview http plnkr co e
  • d3.js。带条的旋转地球仪

    我正在尝试创建带有像这样的酒吧的旋转地球仪这个例子 http data arts appspot com globe 你可以看我的例子here http jsfiddle net zeleniy jrh5xucs 一切都很顺利 直到酒吧超出
  • Webpack 不包括 ProvidePlugins

    我正在开发一个小型试用 Web 应用程序 它使用 vue webpack 模板 https github com vuejs templates webpack https github com vuejs templates webpac
  • d3.js V4 按钮缩放实现表现得很奇怪

    我正在尝试实现 d3 平移和缩放功能 默认的平移和缩放工作正常 但要求是我们还需要放大和缩小按钮 我还实现了缩放按钮 它也有效 奇怪的是 当我第一次移动图像并单击缩放按钮时 图像会移回到以前的位置 不仅是当我第一次用鼠标缩放并使用按钮再次开
  • 如何在 d3.scale.ordinal() 中指定域?

    var W 100 var H 200 var data v 4 v 8 v 15 v 16 v 23 v 42 var x d3 scale linear domain 0 max x range 0 W var y d3 scale o
  • 具有水平和垂直组合布局的可折叠树

    我正在尝试在 D3 中创建一个可折叠树 它结合了水平 第一级和第二级 和垂直 3 级 布局 这里有一个jsfiddle http jsfiddle net artemkolotilkin z7tb23Lo 到目前为止我所得到的 除了一件事之
  • 带列的树视图

    我需要为我正在编写的应用程序提供一个多列树视图 我想知道是否有人知道免费工作 在 Vs 2010 中 多列树视图 网络上可以找到许多示例控件 Net 的 TreeViewAdv http sourceforge net projects t
  • 使用 MVVM 在 WPF 中打印 TreeView

    我有一个树视图来从文本文件返回文本搜索结果
  • Ttk Treeview:跟踪键盘选择

    这是一个带有 ttk 树视图的 Tk 小部件 当用户单击该行时 会执行某些功能 此处仅打印项目文本 我需要的是以下内容 最初的重点是文本输入 当用户按下 Tab 键时 焦点应该转到第一行 并且应该执行绑定到 Click 事件的函数 当用户使
  • d3.js:非线性图轴

    我正在尝试在轴上添加自定义比例 如下所示 这个想法是 一个刻度总是比前一个刻度大 2 倍 我的理解是 这是一个定制秤 我做了一些研究 但找不到类似的东西 所以我想我的问题实际上是两个问题 这个尺度是数学世界的 标准 吗 这是否可以使用来实现
  • 使用 d3 进行多级/分组轴标签

    我想知道是否有一种简单的方法可以在 d3 中添加多级 分层 分组轴标签 例如 如果我有一个折线图 其中 x 轴的月份名称跨越多年 那么我还希望将年份作为月份名称下方的标签 因此它看起来像这样 Oct Nov Dec Jan Feb Mar
  • D3 v4 在同一元素上进行画笔和缩放(鼠标事件不冲突)

    我的目标是构建一个使用两者的 D3 v4 图表d3 zoom https github com d3 d3 zoom and d3 brush https github com d3 d3 brush一起 如下 当鼠标位于 x 轴上时 用户
  • 如何使用 WPF 从 XML 文件创建树视图?

    这是 XML 文件
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a
  • d3.js:修改树布局中的链接

    抱歉我的英语不好 我在这里使用这个例子 http bl ocks org mbostock 4339083 http bl ocks org mbostock 4339083构建树形图 但我用矩形更改了根的子级中的圆圈 现在该图有点混乱 因
  • 在 d3.js 中操纵鼠标悬停在“点击区域”

    我想show and hideSVG 中的一个节点 当鼠标移到 mouseout 问题是我的节点内部的形状是一条宽度只有1 5px的路径 因此在鼠标悬停事件中不容易击中该区域 这对用户体验肯定不方便 我想知道是否有办法做到这一点打击范围更广
  • d3 仅限整数刻度线

    我有一个 d3 条形图 其值范围为 0 3 我希望 y 轴仅显示整数值 我可以这样做 var yAxis d3 svg axis scale y orient right tickFormat d3 format d 但是 非整数标记处仍然
  • 如何在“object”标签内选择 SVG?

    HTML 页面的内容如下所示 方法如下script js looks var tooltip d3 select body append div style position absolute sty
  • D3更新circle-pack数据新节点与现有节点重叠

    我正在关注一般更新模式 http bl ocks org mbostock 3808234但在分层方面存在问题 使用圆形包装布局 我pack新数据 update enter and exit圆形元素 然而 当新元素enter 它们重叠upd

随机推荐

  • Python:排除模块 Pyinstaller

    我开始使用 Pyinstaller 而不是 Py2Exe 然而我很快就遇到了问题 如何排除不需要的模块 以及如何查看包含在单个可执行文件中的模块 我可以删除一些pyd and dll我的 Python 安装中的 DLL 文件夹中的文件 因此
  • 使用 Fluent 验证的 Model T 通用验证器?

    我昨天刚刚了解 Fluent Validation 我认为它非常酷 我已经尝试过并且有效 但我的应用程序目前有多个模型 我必须承认为每个模型编写验证器的压力很大 是否有可能用泛型编写它并找到一种方法来验证每个模型 这就是我的验证器目前的编写
  • 向量的数据如何对齐?

    如果我想处理数据std vector对于 SSE 我需要 16 字节对齐 我怎样才能做到这一点 我需要编写自己的分配器吗 或者默认分配器是否已与 16 字节边界对齐 C 标准需要分配函数 malloc and operator new 为任
  • vbscript 中的 CommonAppData

    客户的应用程序 AppName 的配置文件存储在 CommonAppData 中 在 Windows XP 下是C Documents and Settings All Users Application Data AppName 在 Wi
  • Spring Boot 执行器健康指示器

    我们现在已经在几个项目中使用Spring Boot 我们使用的是最新版本1 2 3 我们正在合并执行器 到目前为止 一切运行良好 除了我们发现 health 指示器 默认 显示服务已关闭 这不是真的 这些服务是通过数据源实现的 它可能会调用
  • 从数组到列表的隐式转换

    如何编写隐式转换Array to List 类型 我尝试了以下方法 但似乎不起作用 scala gt implicit def arrayToList A ClassManifest a Array A List A a toList
  • 对于在浏览器中测试 extjs 代码(最好使用 selenium)有什么建议吗?

    我们一直在使用 selenium 来处理高级网站测试 除了模块级别的大量 python 文档测试之外 并取得了巨大成功 然而 现在我们在很多页面上使用 extjs 并且事实证明很难将 Selenium 测试纳入网格等复杂组件 有人成功为基于
  • 如何在Windows下的cmd窗口中显示日文汉字?

    我有一个英语 Windows 2003 服务器 激活了亚洲语言支持 命令窗口 cmd 设置 仅有的两种可用字体是 raster 和 lucida console 两者都无法正确显示汉字 显示为问号 有没有办法让它们显示出来 在写入控制台之前
  • 在 Delphi 中修改 Rest 服务器上的 URL

    我已经在 Delphi XE 中编写了一个 REST 服务器 使用向导 并且我想稍微更改一下 URL 这样就不用http 192 168 1 84 8080 datasnap rest TServerMethods1 GetListings
  • iOS 8.3 自定义键盘中的“UIView-Encapsulated-Layout-Width”

    我已经实现了自定义键盘 它在运行 iOS 8 2 的设备上运行良好 但是 当我在 iOS 8 3 的设备上运行相同的代码时 我收到以下警告 并且键盘的高度设置不正确 Probably at least one of the constrai
  • Protobuf-net :嵌套 IEnumerable 对象

    我正在使用 Protobuf net 序列化自定义嵌套列表 我知道原生列表不能直接嵌套 这就是为什么我使用容器对象作为内部列表 但是 我也想让我的容器对象 IEnumerable 但这意味着 Protobuf net 会抛出错误 不支持嵌套
  • Java中如何检查字符串是否只包含数字

    在 Java 的 String 类中 有一个称为 matches 的方法 如何使用此方法使用正则表达式检查我的字符串是否仅包含数字 我尝试使用下面的示例 但它们都返回错误的结果 String regex 0 9 String data 23
  • HTML/CSS。去上课吗?

    在 HTML 中 您可以使用标签 TOP 直接进入页面顶部 出于这个原因 我想也许还有可能 单击我的网页中的链接并直接转到特定的类 仅限 html csss 是否可能 不是针对特定的类 因为可以有许多元素具有相同的类名 但使用 ID 是可能
  • 在java中从dropbox下载文件

    我正在编写一个 swing 应用程序 但我确信稍后我会想到更多内容添加到其中 所以我想要一种从 dropbox 下载文件 如果是新文件 的方法 我尝试了很多不同的方法 但他们给我的只是页面的 HTML 有人知道怎么做吗 我当然不会 在我看来
  • 是否可以在同一页面上使用 2 个版本的 jQuery?

    注意 我知道已经有人问过类似的问题here and here 但我正在寻找有关如何进行这项工作的更多说明或完全避免它的充分理由 我正在向已使用旧版本 jQuery 库 1 1 3 1 的现有网站添加功能 我一直在针对最新版本的 jQuery
  • 没有这样的文件或目录错误

    这是我收到的错误 Traceback most recent call last File E stuff module py line 91 in
  • 如何停止枚举 NSAttributedString 的属性?

    在文档中enumerateAttribute据说 关于方法stop该块的参数是 该块可以将该值设置为 true 以停止对该集合的进一步处理 然而 在块内stop参数是一个let我无法将其设置为true 我需要在找到第一个属性出现后停止枚举
  • JavaScript 查找 json 值 [重复]

    这个问题在这里已经有答案了 我需要在国家 地区的 json 列表中搜索 json 是这样的 name Afghanistan code AF name land Islands code AX name Albania code AL na
  • Android RecyclerView重叠项目(卡堆栈)

    如何重叠 RecyclerView 中的项目 就像堆叠卡片一样 提前致谢 要重叠 recyclerView 行 您可以使用它 将此类添加到您的活动中 您可以自定义 vertOverlap public class OverlapDecora
  • D3 树布局可视化 - 继承具有多个父项的子项

    我是 D3 可视化的新鲜人 目前正在为数据沿袭创建 D3 树布局可视化 在数据沿袭流中 子节点可以从多个父节点派生 这是一个例子 在下面的示例中 DevLead 可能与 2 名经理一起工作 var data name Director pa