【D3.js 学习记录】——Force 力导图数据可视化

2023-10-17 15:19

本文主要是介绍【D3.js 学习记录】——Force 力导图数据可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Force 力导图

  • 对数据结构要求比较严格
  • forceSimulation() 与一般的data join不太一样,可以理解为它是d3这么一个大的可视化库中的一个小库

运作机制

输入一批结点List

let nodes = [{},{},{},{}]
set simulation = d3.forceSimulation(nodes)

定义simulation后会发生:

  • 补全 nodes 中每个结点的数据结构
    index(编号),x,y(相对于画布的坐标),vx,vy(两个方向上的速度)
  • 开始模拟粒子运动
    • 粒子质量为1
    • 不断通过内部 timer 触发 ‘tick’ 事件
  • 根据一系列的 ‘力’ 来计算每个粒子的加速度,速度,位置

三个属性

d3.forceManyBody
  • 粒子之间两两作用的力,如果为正就互相吸引,为负就互相排斥
  • strength 为正互相吸引,为负则互相排斥
    即规定是万有引力还是万有斥力,数值是力的大小
d3.forceCenter
  • 指向某一个中心的力,会尽可能让粒子向中心靠近或重合(通常定位画布中央)
d3.forceLink
  • 粒子之间两两的作用力
  • 让互相之间有link的节点保持一个特定的距离
    在保持一定距离的前提下,没有力
    若超出该范围,就会多增加一个力
  • 给图连边用的,最后要设置strength和distance,strength规定了力的大小,distance规定了两两结点连边的距离范围

tick事件

d3.forceSimulation()通过tick事件来更新节点的状态的,状态包括位置,速度,加速度等

更新后的状态仅仅为状态
  • 不会反映到任何图元
  • 仅对数据进行修改
人为设置每次tick要如何更新图元
simulation.on('tick',ticked);
配置simulation
  • 在初始化每个图元后,只要为simulation配置了’tick’的回调,simulation会自动开始模拟。
  • 注意:simulation.stop()会停止timer的tick循环

配置simulation一般用上文介绍的三个属性

  • d3.forceLink
  • d3.forceCenter
  • d3.forceManyBody

图形数据

外层object

在这里插入图片描述

内层links

在这里插入图片描述

代码实现

实现分为4个步骤

数据预处理
links = data.links //边的集合
//创建一个节点的集合
nodes = [];
for (let i  = 0 ; i < data['#nodes'] ; i++){nodes.push({'index': i })
}
图元初始化,data join
const render_init = function(){lines = svg.selectAll('line').data(links).join('line').attr('stroke', 'black').attr('opacity', 1).attr('stroke-width', 1);circles = svg.selectAll('circle').data(nodes).enter().append('circle').attr('r', 5).attr('fill', 'blue')// .call(drag);
}
力模拟
simulation = d3.forceSimulation(nodes).force('manybody', d3.forceManyBody().strength(-30)).force('center', d3.forceCenter(width/2,height/2)).force('link',d3.forceLink(links).strength(0.1).distance(100))
将模拟的力反应在图元上,用ticked更新图元
let circle,line;
const ticked = function(){
lines.attr('x1', d => d.source.x)
.attr('y1', d => d.source.y)
.attr('x2', d => d.target.x)
.attr('y2', d => d.target.y);
circles
.attr('cx', d => d.x)
.attr('cy', d => d.y);
};simulation.on('tick',ticked)

所有调用流程如下

d3.json('datapath').then(data => {data-preprocessing();//预处理render_init();//图元初始化simulation();//力模拟simulation.on('tick',tick);//tick
})

可视化代码

<!DOCTYPE html>
<html><head><title>Force</title><script src="./js/d3.min.js"></script></head><body><svg width="1800" height="920" id="mainsvg" class="svgs"></svg><script>let svg = d3.select('#mainsvg');var width = svg.attr('width'), height = svg.attr('height');let nodes, links;let circles, lines;let simulation;const render_init = function(){lines = svg.selectAll('line').data(links).join('line').attr('stroke', 'black').attr('opacity', 1).attr('stroke-width', 1);circles = svg.selectAll('circle').data(nodes).enter().append('circle').attr('r', 5).attr('fill', 'blue')// .call(drag);}const ticked = function(){lines.attr('x1', d => d.source.x).attr('y1', d => d.source.y).attr('x2', d => d.target.x).attr('y2', d => d.target.y);circles.attr('cx', d => d.x).attr('cy', d => d.y);}d3.json('./data/socfb-Caltech36.json').then(data => {links = data.links//创建一个节点的集合nodes = [];for (let i  = 0 ; i < data['#nodes'] ; i++){nodes.push({'index': i })}console.log(nodes);render_init(); //图元初始化,datajoin line 和 circlesimulation = d3.forceSimulation(nodes).force('manybody', d3.forceManyBody().strength(-30)).force('center', d3.forceCenter(width/2,height/2)).force('link',d3.forceLink(links).strength(0.1).distance(100)).on('tick',ticked)})</script></body>
</html>

可视化效果

在这里插入图片描述

这篇关于【D3.js 学习记录】——Force 力导图数据可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226252

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑