新闻中心

J*aScript数据可视化_D3.js力导向图实现

2025-11-18
浏览次数:
返回列表
首先引入D3库并定义包含nodes和links的数据结构,接着创建SVG容器并初始化力模拟,设置边、电荷和中心力;然后绘制连线、节点及标签,最后通过监听tick事件更新元素位置,并添加拖拽交互以实现动态调整。

javascript数据可视化_d3.js力导向图实现

力导向图(Force-directed Graph)是数据可视化中常见的一种形式,特别适合展示节点之间的关系网络。D3.js 作为强大的 J*aScript 可视化库,提供了完整的物理引擎支持,可以轻松实现力导向图。下面介绍如何使用 D3.js 创建一个基础但功能完整的力导向图。

准备环境与数据结构

要使用 D3.js 实现力导向图,首先引入 D3 库。可以通过 CDN 引入最新版本:

力导向图的数据通常包含两个数组:nodes(节点)和 links(边)。例如:

const graph = {
  nodes: [
    { id: "A" },
    { id: "B" },
    { id: "C" }
  ],
  links: [
    { source: "A", target: "B" },
    { source: "B", target: "C" }
  ]
};

每个节点有唯一 id,每条边指定 source 和 target 节点。

创建 SVG 容器与力模拟

使用 SVG 绘制图形,并初始化 D3 的力模拟(force simulation):

const width = 800;
const height = 600;

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

const simulation = d3.forceSimulation(graph.nodes)
  .force("link", d3.forceLink(graph.links).id(d => d.id).distance(100))
  .force("charge", d3.forceManyBody().strength(-300))
  .force("center", d3.forceCenter(width / 2, height / 2));

说明:

  • forceLink:定义边的连接关系,distance 控制边长
  • forceManyBody:提供节点间的斥力(负 strength 表示排斥)
  • forceCenter:将整个图居中于画布中心

绘制节点与连线

在 SVG 中添加线段表示边,圆形表示节点:

ChatCut ChatCut

AI视频剪辑工具

ChatCut 1086 查看详情 ChatCut
const link = svg.append("g")
  .selectAll("line")
  .data(graph.links)
  .enter()
  .append("line")
  .attr("stroke", "#999")
  .attr("stroke-width", 1);

const node = svg.append("g")
  .selectAll("circle")
  .data(graph.nodes)
  .enter()
  .append("circle")
  .attr("r", 8)
  .attr("fill", "#4285f4")
  .call(d3.drag()
    .on("start", dragstarted)
    .on("drag", dragged)
    .on("end", dragended)
  );

同时为节点添加标签(可选):

const label = svg.append("g")
  .selectAll("text")
  .data(graph.nodes)
  .enter()
  .append("text")
  .text(d => d.id)
  .attr("font-size", 12)
  .attr("dx", 12)
  .attr("dy", 4);

绑定力模拟与更新位置

监听模拟的 tick 事件,在每次迭代后更新节点、边和标签的位置:

simulation.on("tick", () => {
  link
    .attr("x1", d => d.source.x)
    .attr("y1", d => d.source.y)
    .attr("x2", d => d.target.x)
    .attr("y2", d => d.target.y);

  node
    .attr("cx", d => d.x)
    .attr("cy", d => d.y);

  label
    .attr("x", d => d.x)
    .attr("y", d => d.y);
});

拖拽函数用于交互式调整节点位置:

function dragstarted(event, d) {
  if (!event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x;
  d.fy = d.y;
}

function dragged(event, d) {
  d.fx = event.x;
  d.fy = event.y;
}

function dragended(event, d) {
  if (!event.active) simulation.alphaTarget(0);
  d.fx = null;
  d.fy = null;
}

通过设置 d.fx 和 d.fy,可以在拖动时固定节点位置,提升交互体验。

基本上就这些。只要数据结构清晰,D3 力导向图就能自动布局并支持交互。可根据需要添加颜色映射、提示框、缩放等功能进一步增强可视化效果。

以上就是J*aScript数据可视化_D3.js力导向图实现的详细内容,更多请关注其它相关文章!


# 它很  # 新增网站推广名称怎么填  # 造句搞笑关键词排名软件  # 营销软件推广烟酒  # 稻草熊seo  # 如何推广营销网站  # 山东优化网站推广  # 遂宁网站推广电话  # 私活seo优化  # 泉州网站优化报价  # 佛山抖音营销推广平台  # 可以通过  # 相关文章  # 就能  # javascript  # 拖拽  # 管理器  # 有何  # 如何使用  # 有什么  # 数据结构  # 数据可视化  # cdn  # app  # svg  # node  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  微信聊天记录怎么加密_微信聊天记录加密方法  J*aScript中针对特定容器内图片动画的实现教程  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  J*aScript中localStorage数据的获取、清洗与格式化教程  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  AO3最新镜像入口 Archive of Our Own官方平台访问  不同用户不同价格! 索尼开启账户个性化定价测试  mysql备份恢复性能优化_mysql备份恢复性能优化方法  痛风发作了怎么办? 快速止痛和后期饮食调理  蛙漫2台版漫画地址 Manwa2正版网页版链接  小红书网页版入口链接分享 小红书官网直接进  邮政快递包裹最新位置 邮政快递实时追踪入口  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  CSS Box Model与弹性按钮:维持布局稳定的动画实践  mc.js官网登录入口 mc.js官方登录入口最新版  AO3最新官网入口公告_2025AO3镜像站实时查询方法  我的世界官方游戏入口 我的世界官网平台直达链接  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  千牛数据看板网页版_千牛数据看板网页版访问方法  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  Python Socket多播通信中指定源IP地址的实践指南  Lar*el DB::listen 事件中的查询执行时间单位解析  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  在命令行怎么运行html项目_命令行运行html项目方法【教程】  谷歌google账号怎么注册账号 谷歌账号注册官方流程  Lar*el Form Request中唯一性验证在更新操作中的正确实现  必由学官方登录入口 必由学教师学生账号快速访问  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  从OpenAI API响应中高效提取生成文本  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  顺丰国际快递查询 国际件官方查询入口  限制HTML日期输入框的日期选择范围  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  J*aScript类型检查_j*ascript代码规范  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  ACG动漫视频网入口 ACG动漫*免费正版观看地址 

搜索