如何使用非树数据创建 d3.js 可折叠力布局?

2023-12-02

我有一个 d3 力定向布局,其中的数据具有下面类似的结构。是否可以应用可折叠力布局,例如http://bl.ocks.org/mbostock/1062288到它?我希望单击时折叠/展开节点。

{
  "nodes": [
    {"x": 469, "y": 410},
    {"x": 493, "y": 364},
    {"x": 442, "y": 365},
    {"x": 467, "y": 314},
  ],
  "links": [
    {"source":  0, "target":  1},
    {"source":  1, "target":  2},
    {"source":  2, "target":  0},
    {"source":  1, "target":  3},
    {"source":  3, "target":  2},
  ]
}

如果我理解正确的话,也许这就是您正在寻找的。我编辑了您链接到的演示。现在,当源节点折叠时,我们迭代所有边并查找它有边的其他节点。

对于源节点有边的每个目标节点,我们增加它的折叠计数。如果节点的折叠计数大于零,则不会显示该节点。

当我们取消折叠节点时,我们会做同样的事情,只不过我们会减少折叠计数。

我们需要这种折叠计数,因为我们不在树中,节点可以有多个节点,这会导致它们折叠。

我为有向图做了这项工作,尽管我不确定这是否是您想要的。

让我知道你的想法!

我使用的json:

  {
    "nodes": [
     {"x": 469, "y": 410},
     {"x": 493, "y": 364},
     {"x": 442, "y": 365},
     {"x": 467, "y": 314}
 ],
     "links": [
      {"source":  0, "target":  1},
      {"source":  1, "target":  2},
      {"source":  2, "target":  0},
      {"source":  1, "target":  3},
      {"source":  3, "target":  2}
  ]
 }

修改后的教程代码:

<!DOCTYPE html>
<meta charset="utf-8">
<title>Force-Directed Graph</title>
<style>

.node {
  cursor: pointer;
  stroke: #3182bd;
  stroke-width: 1.5px;
}

.link {
  fill: none;
  stroke: #9ecae1;
  stroke-width: 1.5px;
}

</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

var width = 960,
    height = 500,
    root;

var force = d3.layout.force()
    .size([width, height])
    .on("tick", tick);

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

//Added markers to indicate that this is a directed graph
svg.append("defs").selectAll("marker")
    .data(["arrow"])
    .enter().append("marker")
    .attr("id", function(d) { return d; })
    .attr("viewBox", "0 -5 10 10")
    .attr("refX", 15)
    .attr("refY", -1.5)
    .attr("markerWidth", 4)
    .attr("markerHeight", 4)
    .attr("orient", "auto")
    .append("path")
    .attr("d", "M0,-5L10,0L0,5");

var link = svg.selectAll(".link"),
    node = svg.selectAll(".node");

d3.json("graph.json", function(json) {
  root = json;
  //Give nodes ids and initialize variables
  for(var i=0; i<root.nodes.length; i++) {
    var node = root.nodes[i];
    node.id = i;
    node.collapsing = 0;
    node.collapsed = false;
  }
  //Give links ids and initialize variables
  for(var i=0; i<root.links.length; i++) {
    var link = root.links[i];
    link.source = root.nodes[link.source];
    link.target = root.nodes[link.target];
    link.id = i;
  }

  update();
});

function update() {
  //Keep only the visible nodes
  var nodes = root.nodes.filter(function(d) {
    return d.collapsing == 0;
  });
  var links = root.links;
  //Keep only the visible links
  links = root.links.filter(function(d) {
    return d.source.collapsing == 0 && d.target.collapsing == 0;
  });

  force
      .nodes(nodes)
      .links(links)
      .start();

  // Update the links…
  link = link.data(links, function(d) { return d.id; });

  // Exit any old links.
  link.exit().remove();

  // Enter any new links.
  link.enter().insert("line", ".node")
      .attr("class", "link")
      .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; })
      .attr("marker-end", "url(#arrow)");

  // Update the nodes…
  node = node.data(nodes, function(d){ return d.id; }).style("fill", color);

  // Exit any old nodes.
  node.exit().remove();

  // Enter any new nodes.
  node.enter().append("circle")
      .attr("class", "node")
      .attr("cx", function(d) { return d.x; })
      .attr("cy", function(d) { return d.y; })
      .attr("r", function(d) { return Math.sqrt(d.size) / 10 || 4.5; })
      .style("fill", color)
      .on("click", click)
      .call(force.drag);
}

function tick() {
  link.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; });
}

// Color leaf nodes orange, and packages white or blue.
function color(d) {
  return d.collapsed ? "#3182bd" : d.children ? "#c6dbef" : "#fd8d3c";
}

// Toggle children on click.
function click(d) {
  if (!d3.event.defaultPrevented) {
    //check if link is from this node, and if so, collapse
    root.links.forEach(function(l) {
      if(l.source.id == d.id) {
        if(d.collapsed){
          l.target.collapsing--;
        } else {
          l.target.collapsing++;
        }
      }
    });
    d.collapsed = !d.collapsed;
  }
  update();
}

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

如何使用非树数据创建 d3.js 可折叠力布局? 的相关文章

  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • 将文本放置在矩形的中心

    在下面的代码中 文本没有放置在矩形的中心 我使用的是 attr dx x bandwidth 2 attr dy y bandwidth 2 有没有办法将文本中心放置在矩形中 而不是反复试验 目前它看起来像这样 朝底部和朝右 以下是我的代码
  • 在 Seaborn 中为 python 创建箱线图 FacetGrid

    我正在尝试在seaborn中为4个箱线图创建一个4x4 FacetGrid 每个箱线图根据虹膜数据集中的虹膜种类分为3个箱线图 目前 我的代码如下所示 sns set style whitegrid iris vis sns load da
  • 需要帮助绘制多元线之间的区域 - 而不是从轴到线

    我是 d3 js 的新手 我正在努力填充多元百分位数图中线条之间的区域 我不希望在最底线下方或最顶线上方填充任何区域 第一列始终位于图表的底部 第 5 个百分位 最后一列将始终位于图表的顶部 第 95 个百分位 我需要每条线之间单独的区域段
  • Silverlight 中的图形可视化

    我有一个表示有向图的数据结构 我正在寻找一个好的 Silverlight 可视化 以允许我从一个节点导航到另一个节点 最好带有一些漂亮的动画 有谁知道这种显示有什么好的 UI 控件或框架吗 甚至是来自另一个领域的样本 也许是社交网络 我的图
  • 如何按升序或降序对 Seaborn 条形图进行排序 [重复]

    这个问题在这里已经有答案了 EXCEL 文件包含有关 7000 个 Apple App store 的信息 如下所示 这是我的代码 gt import seaborn as sns import matplotlib pyplot as p
  • 使用 Java 进行树可视化 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个库来生成图形或树 例如组织图表 该库应该能够从该图中生成纯图像 有谁知道一个好的 希望开源
  • O(1) 算法确定节点是否是多路树中另一个节点的后代?

    想象一下下面的树 A B C D E F 我正在寻找一种方法来查询 F 是否是 A 的后代 注意 F 不需要是directA 的后代 在这种特殊情况下这是正确的 只需要针对更大的潜在后代节点池测试有限数量的潜在父节点 当测试一个节点是否是潜
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • nvd3 格式化日期始终返回 1970-01-01

    我正在尝试使用构建折线图nvd3 for d3js但我在 x 轴上使用日期域时遇到了一些问题 这是我的代码 data lineChart key key1 values x 2014 04 20 y 6 x 2014 04 13 y 5 x
  • 如何在 SVG 元素上使用箭头标记?

    我需要在 d3 js 中创建一个箭头 但我找到的只是带有节点图的示例 我需要的是简单地制作一个从 A 点到 B 点的箭头 我尝试实现以下示例中的部分代码 http bl ocks org 1153292 http bl ocks org 1
  • 增加 D3 图中边缘的可点击区域

    我有一个由 d3 制作的图 dagre d3 位于其顶部用于绘制有向图 这给出了我对渲染图表的期望 要编辑构建图表的数据 每个元素都是可单击的 这对于使用标签渲染边缘的情况来说很好 但它们并不总是有标签 导致未标记的边缘很难单击进行编辑 分
  • 平移/缩放顺序尺度?

    我正在使用 d3 渲染简化的甘特图 并使用 d3 behavior zoom 进行平移和缩放 x 刻度是一个时间刻度 稍微修改为列中的中心日历日等 并且工作得很好 但是我在决定如何缩放 平移 y 刻度时遇到问题 其域是通常会出现的任务列表图
  • iOS 上有像 JUNG 这样的可视化框架吗?

    有没有类似的可视化框架JUNG http jung sourceforge net applet index html对于iOS 我想实现类似的东西this http prefuse org gallery graphview iOS 上最
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处
  • 使 D3 响应式:viewBox 与 resize()?

    我必须构建在平板电脑 桌面显示器以及某些情况下非常大的 4k 高分辨率影院尺寸显示器上都能正常运行的 d3 可视化效果 因此 我试图找出使用 SVG 的 viewBox 属性和 preserveaspectratio 与调用调整大小函数以在
  • 算法 - 树中所有节点的最大距离

    所以 找到树中两个节点之间的最长路径相当容易 但我想要的是找到从节点出发的最长路径x到树中的另一个节点 对于所有x 这个问题也可以用以下方式表达 计算从给定的树中可以生成的所有有根树的高度 One way of course is to j
  • Python Pandas 按列对多索引进行排序,但保留树结构

    使用 pandas 0 20 3 我尝试按列 D 对数据帧的 n 个多级进行排序 其中的值 降序 以便维护组的层次结构 输入示例 D A B C Gran1 Par1 Child1 3 Child2 7 Child3 2 Par2 Chil
  • 修改 GGplot2 对象

    然而 我很好奇 是否可以添加任何特定的图例或将哪个物种对应于观察到的预期绘图中 以分别知道它是哪个圆圈 我目前使用的是一个名为 finches 的假数据集 该包称为 cooccurr 它创建一个 ggplot 对象 我很好奇如何实际编辑它以
  • 如何在 SQL 中进行广度优先搜索?

    给定一棵存储为关系的树 Parent Child 1 2 1 3 3 4 3 5 2 6 7 8 7 9 如何获取给定节点的所有后代 例如 对于 1

随机推荐

  • 为什么iOS坐标系很难理解??只有我?

    我正在研究iOS的UIView 我发现我无法理解边界是如何工作的 For example 请运行此代码 并看到红色框在移动 红框升起来了 白色的根视图是静态的 为什么 为什么红框会上升 请让我知道OTL class ViewControll
  • 互相关

    我一直在尝试找到时移信号响应与作为参考的另一个信号响应之间的互相关性 但发现很难使我的时移反映在 xcorr 函数中 matlab代码粘贴在下面 如果有人能就如何实现xcorr函数提出建议 我将不胜感激 这样我就可以确定两个信号响应相关的时
  • 使用 [].replace 复制数组

    我有一堂课 我正在使用Array shift实例变量上的实例方法 我以为我制作了实例变量的 副本 但事实上我没有并且shift实际上是在改变实例变量 例如 在我期望得到之前 foo bar baz 两次均给出以下信息 class Foo a
  • 使用带有进度报告的 C# 提取 ZipFile

    谁能告诉我是否有可能 如果有的话给出一个例子 如何让进度条 如果可能的话还有状态标签 显示使用 ZipFile Ionic zip http dotnetzip codeplex com 我的 WinForm 在将 ZIP 文件从我选择的路
  • Python-获取日期格式[重复]

    这个问题在这里已经有答案了 我获取一个字符串形式的日期 然后将其解析为日期时间对象 有什么方法可以检查对象的日期格式是什么 假设这是我正在创建的对象 modified date parser parse 2015 09 01T12 34 1
  • 局部变量赋值的退出状态错误

    下面的例子展示了如果temp file被制作local作为同一行的一部分mktemp被调用 然后使用检索退出状态 始终为零 无论命令成功还是失败 mktemp xyz使用它总是会失败 如果temp file被制作local提前然后 退出状态
  • 对目标 c 中的负数和正数进行排序

    我通过网络服务列出了物品的数量百分比 我得到的响应是类似于下面代码的字典数组 我需要它以排序的格式 NSArray numberArray NSArray arrayWithObjects NSDictionary dictionaryWi
  • 在 Java Swing 中向 JPanel 添加按钮

    我将 JLabel 和 JCombobox 附加到 JPanel 这工作正常 但是当我向其中添加另外两个按钮时 我看不到这些按钮 下面是我的代码 JPanel jPanel new JPanel jPanel setLayout null
  • 从 ASP.NET Web API 中的控制器返回二进制文件

    我正在使用 ASP NET MVC 的新 WebAPI 开发一个 Web 服务 该服务主要提供二进制文件 cab and exe files 以下控制器方法似乎有效 这意味着它返回一个文件 但它将内容类型设置为application jso
  • 如何将原始 POST 数据传递到 urllib3 中?

    尝试使用 urllib3 发布 JSON 编码数据 只是希望我的 POST 有效负载是原始 JSON 字符串 内容类型为 application json 我只是不知道该怎么做 urllib3 文档描述了在 字段 中发布数据 即带有 键 值
  • 条件长度 > 1 并且 if else 语句中仅使用第一个元素

    pred data frame seq 1 100 by 2 obs data frame seq 1 100 by 3 pr data frame seq 1 200 by 4 for i in 1 dim pred 2 if pr i
  • 从 Pyscripter 中的函数调用时记录不写入文件

    目前 如果我从 python 命令行运行以下代码 它将写入由filename正如预期的那样 import logging def test logging basicConfig format asctime s message s dat
  • 带有 ManagedBeans 的 Primefaces 总是返回 null [重复]

    这个问题在这里已经有答案了 我有个问题 我有一个表格 通过将输入发送到 bean 进行调试 在 bean 对象中始终为 null 你能帮我解决这个问题吗 这里是代码
  • 代码仅从 Firebase 中的数据检索一个值

    正如标题所示 我正在尝试从 firebase 数据库检索一些数据 但我的代码无法正常工作 我在 帖子 中有三个孩子 我猜这就是你对他们的称呼 名为 标题 描述 和 用户名 我试图获取所有这些孩子并将它们附加到一个变量中以便稍后使用它们 但它
  • iCal 格式 - 存储事件创建者

    我目前正在编写一个大致基于 iCalendar 标准的日程安排应用程序 有谁知道我可以在哪个属性中存储活动创建者的信息 通过浏览 iCalendar RFC 2445 我找到了这个属性 组织者 即使活动创建者是唯一参与活动的人 我是否可以将
  • 内存布局意味着Go中[]T无法转换为[]接口?

    所以我一直在阅读这两篇文章和这个答案 无法将 string 转换为 interface 表示需要更改内存布局 http jordanorelli com post 32665860244 how to use interfaces in g
  • 如何在移动设备的 Facebook 即时游戏中创建 Phaser 按钮

    我正在尝试在移动设备上使用 Phaser 2 CE 创建一个按钮 但它不会触发 即使它在桌面上运行良好 整个代码也会打开我的 github 存储库但目前我只能显示一个图像 如下面的代码所示 var game new Phaser Game
  • PROLOG 打印以 7 结尾且其数字之和大于 100 的数字

    我需要创建一个谓词来接收数字列表并仅打印以 7 结尾且其数字之和大于 100 的数字 我为分离做了谓词 但我需要帮助将两个谓词合并起来 我的意思是这两个谓词进入一个唯一的谓词 这就是我到目前为止所做的 sum of digits great
  • 如何导入 java 的 multimap?

    这有点愚蠢 但我该如何安装MultiMap 我需要一种将多个值存储到键的方法 但我的地图实现无法正常工作 那堂课 MultiMap 不是 Java 标准库的一部分 它是一部分阿帕奇共享区 一组独立的实用程序类 许多 Java 开发人员认为很
  • 如何使用非树数据创建 d3.js 可折叠力布局?

    我有一个 d3 力定向布局 其中的数据具有下面类似的结构 是否可以应用可折叠力布局 例如http bl ocks org mbostock 1062288到它 我希望单击时折叠 展开节点 nodes x 469 y 410 x 493 y