如何可视化 d3 力导向图布局中的节点组

2023-11-24

我正在寻找一种将组插入到我的力导向图形可视化中的方法。到目前为止我已经找到了三个相关的例子:

  • Cola.js这将需要添加另一个库,并可能需要改造我的代码以适应这个不同的库。

  • 这个街区,这很难解开。

  • 这张幻灯片来自 mbostock 的幻灯片,这不是我想要的,但走在正确的道路上......

我最想要的是一种简单的方法,从第一个链接添加非常接近结构的东西,但没有太多的开销。

现在我有一个非常标准的设置:

var link = g.selectAll(".link")
            .data(graph.links)
            .enter().append("line")
            .attr("class", "link")
            .style(...

var node = g.selectAll(".node")
            .data(graph.nodes)
            .enter().append("g")
            .attr("class", "node")
            .attr("id", function(d) { return d.id; })

我希望从 cola.js 中获取 d3 代码并对其进行修改,但该库似乎相当复杂,因此不会太容易。我希望在直接 d3 中得到类似这样的东西并不太难:

enter image description here

Thanks!


我更多地遵循标题“可视化节点组”而不是建议的图片,但我认为调整我的答案以显示如图所示的边界框并不难

可能有一些仅限 d3 的解决方案,几乎所有这些解决方案都几乎肯定需要手动调整节点位置以保持节点正确分组。最终结果不会严格意义上是典型的力布局,因为除了连接性之外,还必须操纵链接和节点位置来显示分组 - 因此,最终结果将是每个力之间的折衷 - 节点电荷、长度强度和长度、和组。

实现目标的最简单方法可能是:

  1. 当链接链接不同组时削弱链接强度
  2. 在每个刻度上,计算每个组的质心
  3. 调整每个节点的位置,使其更靠近组的质心
  4. 使用 voronoi 图显示分组

对于我的示例,我将使用 Mike 的规范兵力布局.

当链接链接不同组时削弱链接

使用链接的示例,当链接目标和链接源具有不同的组时,我们可以减弱链接强度。指定的强度可能需要根据部队布局的性质进行更改 - 更多相互连接的群体可能需要具有较弱的群体间链接强度。

要根据是否有组间链接来更改链接强度,我们可以使用:

var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d) { return d.id; }).strength(function(link) {   
      if (link.source.group == link.source.target) {
        return 1; // stronger link for links within a group
      }
      else {
        return 0.1; // weaker links for links across groups
      }   
      }) )
    .force("charge", d3.forceManyBody().strength(-20))
    .force("center", d3.forceCenter(width / 2, height / 2));

在每个刻度上,计算组质心

我们想要将组节点强制在一起,为此我们需要知道组的质心。数据结构simulation.nodes()不是最适合计算质心的,所以我们需要做一些工作:

var nodes = this.nodes();
var coords ={};
var groups = [];

// sort the nodes into groups:  
node.each(function(d) {
    if (groups.indexOf(d.group) == -1 ) {
        groups.push(d.group);
        coords[d.group] = [];
    }
    coords[d.group].push({x:d.x,y:d.y});    
})

// get the centroid of each group:
var centroids = {};

for (var group in coords) {
    var groupNodes = coords[group];
    var n = groupNodes.length;
    var cx = 0;
    var tx = 0;
    var cy = 0;
    var ty = 0;

    groupNodes.forEach(function(d) {
        tx += d.x;
        ty += d.y;
    })

    cx = tx/n;
    cy = ty/n;

    centroids[group] = {x: cx, y: cy}   
}

调整每个节点的位置,使其更靠近其组的质心:

我们不需要调整每个节点 - 只需调整那些偏离质心相当远的节点即可。对于那些足够远的节点,我们可以使用质心和节点当前位置的加权平均值将它们推近。

我修改了用于确定节点是否应在可视化冷却时进行调整的最小距离。在大多数情况下,当可视化处于活动状态时,当 alpha 较高时,优先级是分组,因此大多数节点将被迫朝向分组质心。当 alpha 下降到零时,节点应该已经分组,并且强制它们的位置的需要不再那么重要:

// don't modify points close the the group centroid:
var minDistance = 10;

// modify the min distance as the force cools:
if (alpha < 0.1) {
    minDistance = 10 + (1000 * (0.1-alpha))
}

// adjust each point if needed towards group centroid:
node.each(function(d) {
    var cx = centroids[d.group].x;
    var cy = centroids[d.group].y;
    var x = d.x;
    var y = d.y;
    var dx = cx - x;
    var dy = cy - y;

    var r = Math.sqrt(dx*dx+dy*dy)

    if (r>minDistance) {
        d.x = x * 0.9 + cx * 0.1;
        d.y = y * 0.9 + cy * 0.1;
    }
})

使用 Voronoi 图

这允许最简单的节点分组 - 它确保组壳之间没有重叠。我没有内置任何验证来确保一个节点或一组节点不会与组中的其他节点隔离——具体取决于您可能需要的可视化的复杂性。

我最初的想法是使用隐藏的画布来计算壳是否重叠,但是使用 Voronoi,您可能可以计算每个组是否使用相邻单元格进行合并。如果存在非合并组,您可以对杂散节点使用更强的强制.

应用 voronoi 相当简单:

  // append voronoi  
  var cells = svg.selectAll()
  .data(simulation.nodes())
  .enter().append("g")
  .attr("fill",function(d) { return color(d.group); })
  .attr("class",function(d) { return d.group })

  var cell = cells.append("path") 
    .data(voronoi.polygons(simulation.nodes()))

并在每个刻度上更新:

// update voronoi:
cell = cell.data(voronoi.polygons(simulation.nodes())).attr("d", renderCell);

Results

总而言之,在分组阶段看起来是这样的:

enter image description here

当可视化最终停止时:

enter image description here

如果第一张图片更好,则删除更改的部分minDistance当阿尔法冷却下来时。

Here's a block使用上述方法。

进一步修改

我们可以使用另一个力图来定位每个组的理想质心,而不是使用每个组节点的质心。该力图对于每个组都有一个节点,每个组之间的链接强度将对应于组的节点之间的链接数量。使用这个力图,我们可以将原始节点强制朝向我们理想化的质心 - 第二个力布局的节点。

这种方法在某些情况下可能有优势,例如通过更大的数量来分隔群体。这种方法可能会给你带来类似的结果:

enter image description here

我在这里包含了一个示例,但希望代码有足够的注释以便理解,而不会像上面的代码那样进行细分。

第二个例子.

voronoi 很简单,但并不总是最美观,您可以使用剪辑路径将多边形剪辑为某种椭圆形,或者使用渐变叠加在多边形到达边缘时将其淡出。根据图的复杂性,一种可能的选择是使用最小凸多边形,尽管这对于少于三个节点的组来说效果不佳。边界框在大多数情况下可能不起作用,除非你真的保持高强制因子(例如:保持minDistance整个时间都非常低)。权衡始终是您想展示更多内容:连接或分组。

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

如何可视化 d3 力导向图布局中的节点组 的相关文章

  • 需要帮助绘制多元线之间的区域 - 而不是从轴到线

    我是 d3 js 的新手 我正在努力填充多元百分位数图中线条之间的区域 我不希望在最底线下方或最顶线上方填充任何区域 第一列始终位于图表的底部 第 5 个百分位 最后一列将始终位于图表的顶部 第 95 个百分位 我需要每条线之间单独的区域段
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 在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
  • 使用 d3-geo-projection 命令行工具设置自定义投影

    我正在尝试使用 geoproject 在 geojson 文件上设置投影 具体来说 我正在尝试将投影设置为 BCalbers http spatialreference org ref epsg 3005 http spatialrefer
  • 平移/缩放顺序尺度?

    我正在使用 d3 渲染简化的甘特图 并使用 d3 behavior zoom 进行平移和缩放 x 刻度是一个时间刻度 稍微修改为列中的中心日历日等 并且工作得很好 但是我在决定如何缩放 平移 y 刻度时遇到问题 其域是通常会出现的任务列表图
  • 根据子节点数量动态调整 d3 树布局的大小

    从这个例子来看http mbostock github com d3 talk 20111018 tree html http mbostock github com d3 talk 20111018 tree html我已经建立了一个d3
  • 如何进行多个 d3 窗口大小调整事件

    我有三个svg一页上的元素 每个元素都由 D3 陪伴 每个都有自己的页面调整大小逻辑 由我写的简单模块 https github com TimeMagazine d3 base让他们做出反应 问题在于 只有最后一个调整大小事件被触发 因为
  • dc lineChart 单击时弹出数据点信息

    我正在尝试检测折线图数据点上的点击 Per this answer dc scatter plot binding onClick event https stackoverflow com a 22772340 1873386 I am
  • 在 d3.js 中换行长文本

    我想将长文本元素换行为宽度 这里的例子取自博斯托克的wrap功能 http bl ocks org mbostock 7555321 但似乎有两个问题 首先 wrap的结果没有继承元素的x值 文本左移 其次它绕在同一条线上 并且lineHe
  • 多个链接 dc.js 图表的 d3-tooltips

    我正在寻找修改 dc js 的开箱即用工具提示 似乎有一个解决方案使用d3 js 工具提示 https github com Caged d3 tip as in 这个问题 https stackoverflow com questions
  • 赋予 d3 序数轴标签与尺度名称不同

    我有一个序数scale具有不同值的某些标签 我想显示该比例的轴 其中轴标签与比例标签不同 我有这个代码 var width 1000 var height 600 var margins left 100 40 right 25 botto
  • d3 树 - 有相同孩子的父母

    我一直在将代码从 JIT 转换为 D3 并使用树布局 我已经复制了代码http mbostock github com d3 talk 20111018 tree html http mbostock github com d3 talk
  • 如何在 d3.js 中填充 svg 圆圈内的图像

    这是我在 svg 中填充圆圈的代码 var svgContainer d3 select body append svg attr width 1000 attr height 1000 var circles svgContainer s
  • 如何从 mysql 数据库中提取数据并使用 D3.JS 进行可视化?

    我有一个数据库MySQL我想在其中可视化D3 JS 为了做到这一点 首先我想parse中的数据JSON格式 然后编写一个基本代码 从数据库中提取数据并使用D3 JS 我环顾四周 但找不到我想要的东西 因为我是新手D3 JS 我怎样才能做到这
  • 创建链接到 csv 文件的表

    我正在尝试创建一个链接到的表 csv使用 d3 文件 但我得到的只是一个空白网页 即使以克里米亚为例 我也得到一张空白页 我将很高兴得到指导或展示一个可行的例子或关于我做错了什么的建议 如果您询问如何从 CSV 数据创建 HTML 表 这就
  • 调整发散堆积条形图以使用通用更新模式

    我一直在使用可用的堆积条形图示例here https bl ocks org mbostock b5935342c6d21928111928401e2c8608使用以下代码 var data month Q1 2016 apples 384
  • 根据 D3 中的属性值对对象进行排序

    我有一系列在 D3 中使用的对象 例如 var cities city London country United Kingdom index 280 city Geneva country Switzerland index 259 ci
  • 如果满足条件,则在另一个转换期间添加并发转换

    我试图在转换运行时添加一个新的转换 条件是如果 bar1 宽度与 bar2 匹配 则条形会更改位置 我使用了transition tween来查看是否满足条件 当第二个转换开始时 第一个转换停止 我希望第一个转换继续运行直到其持续时间结束
  • 请建议 D3.js 进行 CSV 数据导入

    我正在尝试使用 D3 js 导入 CSV 数据 var englishArray d3 csv data csv function d return d value function error data var englishArray

随机推荐

  • 像谷歌地图一样滑动BottomSheet

    目前我正在使用来自this lib 我想实现这样的图像动画谷歌地图在滑动底页时 我想按照所示的图像一起滑动图像视图 我已经用过这个了帮助链接但没有得到 我已经尝试了很多时间 但找不到任何解决方案 任何帮助都可以 提前致谢 你能行的修改默认B
  • async/await 会阻塞一个线程node.js

    When async await在node js函数中使用 它会阻塞node js线程直到它执行下一行代码吗 async await不会阻塞整个解释器 node js 仍然以单线程方式运行所有 Javascript 即使某些代码正在等待as
  • 使用 JRuby 或包执行时如何使用 rspec 启用颜色?

    我正在尝试使用 JRuby 运行我的 rspec rake spec 结果是 jruby S bundle exec rspec color spec foo spec rb 没有显示颜色 所以我从等式中删除了 Jruby bundle e
  • 如何在android中将json对象转换为字符串..?

    我想转换自JSONObject CNo 80 CName ganesh CMail email protected CMailType home CPhNo 9878987776 CPhNoType home ClientNo 1 to C
  • 如何在android ndk中使用GraphicBuffer

    我问这个问题是参考我的问题的答案如何提高android中opengl es的显示性能 我试图构建使用 GraphicBuffer 和 ndk r9d 的代码 但它说 GraphicBuffer 没有在此范围内声明 对于eglCreateIm
  • 是否可以因自定义运行而永久更新 TeamCity 构建参数的值?

    是否可以通过自定义运行永久更新构建参数的值 例如 考虑一个配置为具有内部版本号格式的内部版本 主要 次要 补丁 build counter Major Minor 和 Patch 并在构建配置中定义为具有某些值 举个例子 假设构建号为 3
  • UIButton 作为 UINavigationbar 按钮

    我有一个标签栏应用程序 在其中一个选项卡栏中我有一个导航控制器 我正在尝试设置一个带有图像的 UIButton 作为导航栏的右侧按钮 UIButton refreshButton UIButton alloc init refreshBut
  • QComboBox 的 setPlaceholderText [重复]

    这个问题在这里已经有答案了 如果没有子类化 我可以在 QComboBox 文本中显示未进行选择的文本 例如 QLineEdit 中的 setPlaceholderText 吗 QComboBox 没有占位符文本选项 但您可以通过两种方式实现
  • 是否可以将两个调试器附加到一个进程?

    是否可以将两个调试器附加到一个进程 最近 我用 HTML5 CSS 开发了一个 Metro 风格应用程序 它调用了用 C 编写的 Window 运行时组件 我想做的是将两个调试器附加到同一个进程 一个用于 JavaScript 另一个用于
  • 刷新页面时 Socket IO 建立多个连接 - Node JS

    我开发了一个抓取工具 可以从所有网站抓取作业并将其保存到数据库中 我已经制作了自己的默认日志 在其中获取消息 错误 信息 等 我正在使用 socket io 来实时更新我的 视图以及数据库 问题是当我启动应用程序时 它完美地建立了套接字和数
  • 理想的 terraform 工作空间项目结构

    我想设置 Terraform 来管理开发 阶段 产品环境 所有环境中的基础设施都是相同的 但每个环境中的变量都存在差异 既然 Terraform 0 10 中引入了工作区 那么理想的 Terraform 项目结构是什么样的 在命名 标记基础
  • PKCS5_PBKDF2_HMAC_SHA1返回值是什么意思?

    我正在尝试使用 OpenSSLPKCS5 PBKDF2 HMAC SHA1方法 我推测如果成功则返回 0 否则返回一些其他值 我的问题是 非零返回值是什么意思 内存错误 使用错误 我的程序应该如何处理它 重试 退出 编辑 一个必然的问题是
  • Android 上的鱿鱼:最大继承深度

    这是我的设置 声纳Qube 5 6 6 SonarJava插件4 8 0 9441 Code public class BaseActivity extends android app Activity public class FooAc
  • Pandas MultiIndex DataFrame.rolling 偏移量

    为什么我不能使用偏移量rolling多索引数据框 例如 与 rng pd date range 2017 01 03 periods 20 freq 8D i pd MultiIndex from product A B C rng nam
  • 优先考虑组合而不是继承[重复]

    这个问题在这里已经有答案了 优先考虑组合而不是继承 是非常流行的短语 我读了几篇文章 每篇文章最后都说 当类之间存在纯粹的 IS A 关系时 请使用继承 一个例子来自本文 这里之间Apple and Fruit存在明显的 IS A 关系 即
  • 如何告诉 Vite 从构建中排除目录中的文件子集?

    我使用创建了一个新的 Vue 应用程序npm create vue 在运行时 该应用程序会获取配置并从中读取字符串 该字符串表示要在应用程序内呈现的组件的名称 这些动态组件位于 可插入 目录中 src App vue pluggables
  • Cholesky 分解 ScaLapack 错误

    我收到以下错误 但我不知道为什么 1 1 On entry to PDPOTRF parameter number 2 had an illegal value 1 0 On entry to PDPOTRF parameter numbe
  • 具有依赖关系的静态库

    e exe与我的自定义静态库链接 c lib 它使用 Win32 API 中定义的w dll w dll位于C Windows System32 其导入库为w lib 位于 Windows SDK 目录中 壳w lib被列为额外的依赖 in
  • VS2022 17.2.0 Preview 2.0:访问项目等时出现T4模板序列化异常

    使用VS2022 17 2 0 Preview 2 0使用T4模板生成数据层 T4的一部分使用VS互操作 DTE来访问解决方案中的项目 下面的T4是一个测试 lt template debug false hostspecific true
  • 如何可视化 d3 力导向图布局中的节点组

    我正在寻找一种将组插入到我的力导向图形可视化中的方法 到目前为止我已经找到了三个相关的例子 Cola js这将需要添加另一个库 并可能需要改造我的代码以适应这个不同的库 这个街区 这很难解开 这张幻灯片来自 mbostock 的幻灯片 这不