D3 二维图表的绘制系列(二十四)力导向图

利用Javascript框架——D3.js制作力导向关系图普 因公司业务需求,整理制作了一个实用且酷炫力导向关系图。下面是我自己的一个demo。先Po一下成品图(自己做的数据偏少):图1: 1)、引入D3框架,这里引入的版本是v3.0图2: 2)、数据整理(数据结构如下图)图3:图3:数据解析:数据准备是很重要的一部分。Jstr由两个部分组成:‘nodes’、‘links’,主要数据为‘nodes’,‘links’表示数据之间的联系。‘nodes’部分每条 阅读详情

上一篇: 旭日图 https://blog.youkuaiyun.com/zjw_python/article/details/98613674

下一篇: 中国地图 https://blog.youkuaiyun.com/zjw_python/article/details/98847312

代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/details/98182540

本图完整的源码地址: https://github.com/zjw666/D3_demo/tree/master/src/force/forceLayout

1 图表效果

在这里插入图片描述

2 数据

{
    "name": "alphabet",
    "children": [
        {
            "name": "a",
            "children": [
                {
                    "name": "a1",
                    "children": [
                        {"name": "a11", "house": 2},
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221"
                                }
                            ]
                        },
                        {"name": "a13", "house": 4}
                    ]
                }
            ]
        },
        {
            "name": "b",
            "children": [
                {
                    "name": "b1",
                    "children": [
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221"
                                }
                            ]
                        },
                        {"name": "b12", "house": 2}
                    ]
                },
                {
                    "name": "b2",
                    "children": [
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221"
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "c",
            "children": [
                {
                    "name": "c1",
                    "children": [
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221",
                                    "children": [
                                        {"name" : "c2211"}
                                    ]
                                }
                            ]
                        },
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221",
                                    "children": [
                                        {"name" : "c2211"}
                                    ]
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "c2",
                    "children": [
                        {"name": "c21", "house": 2},
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221",
                                    "children": [
                                        {"name" : "c2211"}
                                    ]
                                }
                            ]
                        },
                        {"name": "c23", "house": 2}
                    ]
                },
                {

                    "name": "c3",
                    "children": [
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221",
                                    "children": [
                                        {"name" : "c2211"}
                                    ]
                                }
                            ]
                        },
                        {
                            "name": "c22",
                            "children":[
                                {
                                    "name" : "c221"
                                }
                            ]
                        }
                    ]
                }
            ]
        }

    ]
}

3 关键代码

导入数据

d3.json('./data.json').then(function(data){
.....

将数据转换为节点类型,方便之后渲染

/* ----------------------------处理数据------------------------  */
const root = d3.hierarchy(data);

const nodes = root.descendants();

const links = root.links();

运用d3.forceSimulation建立力模型,并绑定节点和链接

/* ----------------------------建立力模型------------------------  */
const force = d3.forceSimulation()
                    .velocityDecay(0.8)  //速度衰减
                    .alphaDecay(0)       //alpha衰变, 0表示不衰减
                    .force("charge", d3.forceManyBody())     //节点相互作用力,默认为斥力-30
                    .force("collision", d3.forceCollide(config.pointSize + 0.2).strength(0.1))   //碰撞
                    .force("center", d3.forceCenter(chart.getBodyWidth()/2, chart.getBodyHeight()/2));     //定义力模型坐标的中心点

force.nodes(nodes);   //绑定节点

force.force("link", d3.forceLink(links).strength(1).distance(20));   //绑定节点间链接

渲染节点,注意当节点个数变化时,要重新绑定节点

/* ----------------------------渲染节点------------------------  */
chart.renderNodes = function(){
    const points = chart.body().selectAll('circle')
                                .data(nodes);

          points.enter()
                  .append('circle')
                  .attr('r', config.pointSize)
                  .attr('fill', (d) => chart._colors(d.depth % 10))
                  .attr('stroke', config.pointStroke);

          points.exit()
                  .transition()
                  .attr('r', 1e-6)
                  .on('end', (d) =>{    //删除点,并重新绑定nodes
                        nodes.splice(nodes.indexOf(d),1);
                        force.nodes(nodes);
                    })
                  .remove();
}

绑定鼠标交互事件,这里添加了拖拽事件

/* ----------------------------绑定鼠标交互事件------------------------  */
chart.addMouseOn = function(){
    const drag = d3.drag()
                     .on("start", (d) => {
                        d.fx = d.x;
                        d.fy = d.y;
                     })
                     .on("drag", (d) => {
                        d.fx = d3.event.x;
                        d.fy = d3.event.y;
                     })
                     .on("end", (d) => {
                        d.fx = null;
                        d.fy = null;
                     });

    chart.body().selectAll('circle')
                    .call(drag);
};

添加tick监听事件,实时更新节点和连线位置

/* ----------------------------绑定tick事件------------------------  */
chart.addForceTick = function(){
    force.on("tick", function(){
        chart.body().selectAll('line')
                    .attr("x1", (d) => d.source.x)
                    .attr("y1", (d) => d.source.y)
                    .attr("x2", (d) => d.target.x)
                    .attr("y2", (d) => d.target.y);

        chart.body().selectAll('circle')
                    .attr("cx", (d) => d.x)
                    .attr("cy", (d) => d.y);
    })
};

大功告成!!!


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

D3 二维图表的绘制系列(一)介绍 1 介绍 D3 (或者叫 D3.js )是一个基于 web 标准的 JavaScript 可视化库. D3 可以借助 SVG, Canvas 以及HTML 将你的数据生动的展现出来. D3 结合了强大的可视化交互技术以及数据驱动 DOM 的技术,让你可以借助于现代浏览器的强大功能自由的对数据进行可视化 学习了d3一个多月,通过绘制一些简单的二维图表,总算入门了d3。强烈推荐《D3数据可视化实战... 阅读详情

相关推荐

D3.js的v5版本入门教程(第十四章)—— 力导向图

D3.js的v5版本入门教程(第十四章)          这一章我们来绘制一个力导向图,什么叫力导向图,通俗一点将就是有节点和线组成,当鼠标拖拽一个节点时,其他节点都会受到影响(力导向图有多种类型,本章绘制的效果就是这样,其他类型的读者可以自己去试试),还是给读者提个醒,这一章又会有很多新的知识点,请拿出的学习新东西的本领来     为了绘制一个力导向图,我们还是需要以下新的知识点 d3...

数星星等天明的博客 3万+

D3(四)

可视化图形 可视化的图形主要有两种: 层级结构的可视化 层级结构:树, 最直接、最直观的可视化方案。 数据格式为JSON格式,节点可以包含“属性” 网络结构的可视化 网络结构:图 绘制树状图 树状图用于表示层级、上下级、包含与被包含关系。 绘制一个树状图主要分为四步: 选中页面设置的svg绘制区域的宽高 添加g元素 设置位置 生成树状布局,设置尺寸 对角线生成器 请求数据,渲染数据 获取节点数组和连线数组 绘制连线 绘制节点 给节点添加圆圈设置半径 给节点添加文本 设置文本样式 位置

chili_fan的博客 1986

电价预测的Transformer实战:从注意力机制到超长序列建模

本文深入探讨了Transformer模型在电价预测领域的实战应用,对比了其与LSTM在处理长序列依赖和误差累积问题上的优劣。文章详细解析了自注意力机制的原理,并提供了处理超长序列的位置编码方法、构建专用预测模型的完整PyTorch代码,以及防止信息泄露的关键技巧。通过实战对比,展示了Transformer在并行计算、长距离建模和预测精度上的显著优势,并分享了应对极端波动和提升模型效率的高级优化策略。

f6g7h8i9j的博客 540

深入理解 D3.js 可视化库之力导向图原理与实现

大厂技术坚持周更精选好文简介D3.js[1] 是一个基于 web 标准的 JS 可视化库,它借助 SVG、Canvas 和 HTML 进行数据可视化。在数据可视化中,我们很多时候会使用图来表达数据中所蕴含的信息,图方便让我们清晰的理清各个节点之间的联系,快速提取有用信息。而图布局算法可以使散乱的信息 (信息多以点线的关系承载) 通过一种清晰的方式呈现出来,符合相应的美学标准。不同的图布局[...

趣谈前端 3038

PID详解

1、什么是PID及其作用 设定一个输出目标,反馈系统传回输出值,如与目标不一致,则存在一个误差,PID 根据此误差调整输入值,直至输出达到设定值. 为什么需要PID呢,比如控制温度,我们需要设置一个要达到的目标温度值,当将温度稳定在目标温度值 例如,我们希望水的目标温度值为70°,其希望无非就是可以快速而且无抖动的达到70°,并稳定在70° 如果我们使用普通的方式加热,当温度到达70°后就以及停止加热,岂不是简单快速,当然用在要求不高的场合也可以,但是如果要求更高的场合呢,会出现温度到达70°后......

weixin_48435215的博客 5万+

【TensorRT】TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型(上篇)

开发了TensorRT C# API 2.0版本,该版本在开发时充分考虑了上一版本应用时出现的问题,并进行了改进。同时在本版本中,我们对接口进行了优化,使用起来更加简单,并同时提供了相关的应用案例,方便开发者进行使用。

grape_yan的博客 3038

D3 笔记十:力导向图

本文目前来说,是学完极客学院的《D3.js 入门教程》之后的整理出来的精简知识版,仅仅是为了知识整理。后期我会随着学习的深入,在这个基础上,进行维护与更改。一、力导向图我们先来了解一下力导向图(Force-Directed Graph)的定义。首先,它是绘图的一种算法。在二维或三维空间里配置节点。节点之间用线连接,称为连线。各连线的长度几乎相等,且尽可能不相交。节点和连线都被施加了力的作用。力的大小

JimmyLuo17的博客 3603

Cadence 开发合集【总目录】

专栏主要介绍Cadence原理图和PCB信号完整性电源完整性仿真相关的内容,更加注重实操,以帮助大家轻松上手并不断提高;在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。 ............

fydar的博客 1万+

Vue D3 力导向图(推荐阅读)

1. 安装 前端工程根目录下执行yarn add d3,安装 d3 依赖包。安装的版本"d3": "^5.7.0" 2. vue 文件中引入 d3 import * as d3 from 'd3' 例如一个基础的 d3.vue 文件内容,包含基本的<template><script><style> <template> <div> <svg width="960" height="600"></...

hsany330的专栏 5416

论文翻译:Automatic Lesson Plan Generation via Large Language Models with Self-critique Prompting

在本文中,我们利用大型语言模型(LLMs)的理解和生成能力来自动生成定制化的课程计划。这解决了传统计划可能无法充分满足不同教学环境和学生群体的特定需求的常见挑战。我们提出了一个新颖的三阶段过程,包括使用检索增强生成(RAG)逐步生成课程计划的每个关键组成部分,通过LLMs进行自我批评,以及随后的细化。我们使用这种方法为小学2至5年级生成了涵盖80多个主题的数学课程计划。邀请了三位经验丰富的教育工作者制定全面的课程计划评估标准,然后使用这些标准将我们的LLM生成的课程计划与同一主题的实际课程计划进行基准比较。

CSPhD-winston的博客 1101

Unreal使用nDisplay制作裸眼3D(9宫格)

摘要: nDisplay是虚幻引擎的分布式实时渲染技术,可将内容同步输出到多个显示设备(如LED墙、投影仪等),构建沉浸式可视化系统。其核心功能包括:分布式渲染(支持多台设备协同处理高分辨率内容)、空间透视校正(通过追踪观众动态调整画面几何关系)以及虚拟拍摄应用。配置时需设置集群组件(Cluster、Host、Node、Viewport)定义渲染逻辑,空间组件(nDisplayScreen、ViewPoint)确定投影关系。文中以9宫格配置为例,详细演示了从工程创建到影片渲染合成的全流程,最终通过多视口合成

TxNet 608

可视化工具D3.js教程 入门 (第十二章)—— 力导向图

可视化工具D3.js教程 入门 (第十二章)—— 力导向图 力导向图适合绘制关系型的信息;下面先来说几个关于力导向图的知识点: 1、force(力模型)——是一个用以修改节点位置和速度的函数 链接 1.1、d3.forceSimulation([nodes]) 创建一个新的力导向图; 1.2、simulation.force(name[, force]) 如果指定了 force 则表示添加指定 name 的 force(力学模型)并返回仿真,如下: var simulation = d3.forceSimu

weixin_44867717的博客 4354

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 174

使用d3.js开发力导向图

最近项目需要写一个d3的力导向图,之前没接触过d3.js 所以吧这次开发的经历写一下 文章目录分配点与线创建dom线点绘制线 友情提示:不要让设计设计的华丽呼哨,点多了很卡,而且svg 有些标签是不支持css 控制 某些样式的,也不是很好实现 如果之前没写过d3 的旁友 还不熟悉d3 的话。可以吧d3. js 理解为1个帮助你处理数据的库。 把点与线 给到d3, d3 会根据你传入的长宽 自动给你分配x,y 的位置,自己再通过 js 去点的位置想干嘛干嘛(画点) ###基本的展示 ####基本配置 //

z467469274的博客 1612

运行时安全引擎RSE

该博客重点介绍了运行时安全引擎(Runtime Security Engine,简称 RSE)与应用处理器(Application Processor,简称 AP)之间的关系。 根据 ARM 的参考设计,RSE 是位于同一芯片(die)上的一个独立核心,与 AP 和系统控制处理器(System Control Processor,简称 SCP)并列存在。RSE 为整个系统提供基本的安全保障和运行时服务,例如:可信启动(trusted boot)、度量启动(measured boot)、平台认证(platf

AI-安全-功耗 1364

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

D3力导图绘制-基于line/path(v3、v7)

结果展示 基于Line的力导向图绘制(有简单的交互,可以拖拽,鼠标放上去能显示简介) 主要代码: 基于Line的力导向图绘制 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>D3力导图v3 </title> </head> <body> <script s

菜鸟写写 2704

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

d3 力导向图

力导向图(Force-Directed Graph),是绘图的一种算法。在二维或三维空间里配置节点,节点之间用线连接,称为连线。各连线的长度几乎相等,且尽可能不相交。节点和连线都被施加了力的作用,力是根据节点和连线的相对位置计算的。根据力的作用,来计算节点和连线的运动轨迹,并不断降低它们的能量,最终达到一种能量很低的安定状态。 力导向图能表示节点之间的多对多的关系。 数据

小飞侠的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【D3.js数据可视化系列教程】(三十二)-- 力导向图之弧形箭头连线

弧形箭头连线

司机大傻 1万+

可视化 |【d3】力导向关系图

基于d3.js的力导向关系图实现:包括关系图呈现、悬浮框显示、双击高亮。

知识库搭建ing 2655

【亲测免费】 探索数据可视化新维度:D3.js 中的 d3-hierarchy 模块

在数据可视化的世界中,D3.js 是一个不可或缺的库,它赋予开发者强大的工具来创建交互式且动态的数据图表。而今天我们要聚焦于 D3.js 生态系统中的一个重要模块——d3-hierarchy。这是一个专门用于处理树状和层次结构数据的库,可以助你在复杂的数据海洋中构建出清晰的视觉表示。 ## 项目简介 是 David Baron 创建的一个开源项目,它是 D3.js 的一部分,专注于处理层次结

gitblog_00015的博客 952

D3学习:力导向图布局

今天一早上起来复习了会儿算法的NPC证明,好烧脑,本宝宝现在都有点而力不从心了~ 到图书馆学D3,雷打不动,即使有考试也不放弃码代码~~ 力导向图,之前学过一个比较复杂的,那时候按照一个demo写完了累的本宝宝半死也没怎么理解其中内涵,这回再看,感觉好多了,还是得循序渐进啊~<!DOCTYPE html> <html lang="en"> <head> <meta cha

zkyrjsxdm的博客 3680

网络图(Network Graph)是什么?力导向图的原理、特点与Highcharts网络图用例使用指南

本文介绍了网络图(力导向图)的基本概念、Highcharts实现方法及其核心特点。网络图通过节点和边直观展示实体间关系,Highcharts提供了灵活的配置选项,包括数据格式、布局算法、链接样式和交互功能。核心特点包括物理模拟力导向算法、动态交互性和多样视觉编码,适用于社交网络分析、知识图谱等场景。文章还通过多个用例演示了不同配置效果,为数据可视化提供了实用参考。

Highcharts可视化图表库中文博客 1559

D3.js 第14课 力导向图

力导向图: 每一个节点都受到力的作用而运动,这种是一种非常绚丽的图表。 力导向图(Force-Directed Graph),是绘图的一种算法。 在二维或三维空间里配置节点,节点之间用线连接,称为连线。 各连线的长度几乎相等,且尽可能不相交。节点和连线都被施加了力的作用,力是根据节点和连线的相对位置计算的。 根据力的作用,来计算节点和连线的运动轨迹,并不断降低它们的能量,最终达到一种能...

qq_095的博客 1303

D3力导向图

一、背景 力导向图非常适合于渲染关系型信息图。 二、什么是力导向图(Force-directed)? 我们可以把整张 Network 想象成一个物理仿真系统(Simulation)。系统中的每个节点(Node)都是一个带有能量的粒子,粒子与粒子之间存在斥力(如模拟库伦斥力),而被边(Link)所连结的粒子受到牵引力(如模拟胡克弹力)。系统中的粒子在斥力和引力的不断作用下,从随机无序的布局(L...

顺其自然~专栏 3049

D3.js的力导向图使用入门笔记

D3.js是一个强大的JavaScript数据可视化库,广泛应用于Web端交互式图表。本文重点介绍了其力导向图布局的实现方法,包括核心特点、应用场景和实现步骤。通过官方示例代码解析了力模拟的创建、节点与边的绘制、拖拽交互等关键功能。网络拓扑图的实现流程包括:安装D3、创建SVG容器、定义数据结构、构建力导向布局等。文章还通过类比解释了zoom、container等核心概念,帮助读者理解D3.js的底层机制。该技术适用于动态图表、地理信息、实时数据等可视化场景。

zyxzyx666的博客 1071

力导向图与矩阵排序

一种常见的方法是使用聚类算法,将相似的元素分组,并按照聚类结果重新排列矩阵的行和列。另一种方法是使用基于图论的算法,将矩阵转化为图结构,并根据图的拓扑特征进行排序。在力导向图布局中,每个节点被视为一个带有质量和电荷的粒子,边则表示节点之间的连接关系。布局的目标是通过调整节点的位置,使得相连的节点之间的力平衡,并尽可能降低系统总能量。它基于物理模型,模拟了图中节点之间的相互排斥和连接弹性,以生成具有良好可读性和美观性的图形布局。它的目的是通过重新排列矩阵的行和列,使得矩阵中相关的元素更加集中和可视化。

XUYH6904的博客 1059
上一篇: D3 二维图表的绘制系列(二十三)旭日图
下一篇: D3 二维图表的绘制系列(二十二)桑基图sankey
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值