可视化 | 【d3】桑基图

文章目录

  • 📚d3
  • 📚桑基图应用
    • 🐇html
    • 🐇css
    • 🐇js

在这里插入图片描述

📚d3

d3.js是一个用于创建数据可视化的JavaScript库,它提供了丰富的API和工具来操作文档对象模型(DOM),使得创建可交互的、动态的数据可视化变得更加容易。

  1. 选择元素:使用d3.select()函数可以选择一个元素,使用d3.selectAll()函数可以选择多个元素。选择函数可以接收CSS选择器、DOM元素或函数作为参数。

    var svg = d3.select("#chart"); // 选择id为"chart"的元素
    var circles = d3.selectAll("circle"); // 选择所有的circle元素
    
  2. 绑定数据:使用.data()函数可以将数据绑定到选择的元素上。数据可以是数组、对象或函数的返回值。

    var data = [1, 2, 3, 4, 5];
    var circles = svg.selectAll("circle").data(data);
    
  3. 创建元素:使用.enter()函数可以创建新的元素,这些元素对应于未绑定数据的选择集。可以使用.append().insert()等方法来创建元素。

    var circles = svg.selectAll("circle").data(data).enter().append("circle");
    
  4. 设置元素属性:使用.attr()函数可以设置元素的属性,可以传入属性名和对应的值,也可以传入一个函数来动态计算属性值。

    	circles.attr("cx", function(d, i) {return i * 50; // 根据索引动态设置x坐标}).attr("cy", 50).attr("r", 20);
    
  5. 设置元素样式:使用.style()函数可以设置元素的样式,可以传入属性名和对应的值,也可以传入一个函数来动态计算样式值。

    circles.style("fill", "blue").style("opacity", 0.5);
    
  6. 缓动过渡:使用.transition()可以为元素添加过渡效果,可以设置过渡时间、缓动函数等。

    circles.transition().duration(1000).attr("cx", function(d, i) {return i * 100;});
    
  7. 事件处理:可以使用.on()函数为元素绑定事件处理函数,可以处理鼠标事件(如click、mouseover等)和其他事件(如transitionend等)。

    circles.on("click", function(d) {console.log("Clicked:", d);
    });
    

📚桑基图应用

🐇html

  • 放两个div,一个放图,一个用于悬浮框。
    <div id="chart"></div>
    <div id="tooltip"></div>
    

🐇css

  • #tooltip: 定义了一个绝对定位的工具提示框样式,包括居中对齐、背景颜色、文本颜色和字体样式,以及圆角边框。pointer-events: none; 禁用了鼠标事件,确保工具提示不会干扰用户操作。
  • svg: 设置了SVG元素的全局字体、显示为块级元素以及水平居中。
  • .node rect: 定义了节点(node)矩形的样式,包括移动光标时显示为移动样式、填充不透明度以及形状呈现方式。
  • .node text: 设置了节点文本的样式,包括禁用指针事件、设置不透明度以及字体样式。
  • .link: 设置了链接(link)的样式,包括不填充任何颜色、设置描边颜色以及描边不透明度。
  • .link:hover: 当鼠标悬停在链接上时,修改了描边的不透明度,以增强交互体验。
    body{background: url(./assects/images/background.jpg) center;
    }
    #tooltip {position: absolute;text-align: center;width: auto;height: auto;padding: 2px;background: #13393E;color: #F2CCA6;font-size: 14px;font-family: KaiTi, serif;border: 0px;border-radius: 8px;pointer-events: none;
    }
    svg {font: 10px sans-serif;display: block;margin:0 auto;
    }
    .node rect {cursor: move;fill-opacity: .9;shape-rendering: crispEdges;
    }
    .node text {pointer-events: none;opacity: .5;font-weight: bold;font-family: KaiTi, serif;
    }
    .link {fill: none;stroke: #000;stroke-opacity: .06;}
    .link:hover {stroke-opacity: .18;
    }
    

🐇js

  • 引入js外部库:d3.js本地下载

    <script src="./assects/js/d3/d3.v3.min.js"></script>
    <!-- D3.js的作者之一Mike Bostock提供的Sankey图相关的Javascript库 -->
    <script src="https://bost.ocks.org/mike/sankey/sankey.js"></script>
    

以下是自定义部分⭐️


  • 数据定义:定义节点nodes和链接links。links里的起始按索引设置。
    var json = {"nodes": [{"name": "洛阳"},{"name": "陇西"}...],"links": [{"source": 0,"target": 55,"value": 99},{"source": 1,"target": 56,"value": 47}...   ]};
    
  • 基础设定
    // 定义边距、宽度和高度
    var margin = {top: 3, right: 1, bottom: 3, left: 1}, // 定义边距的对象width = window.innerWidth * 0.5 - margin.left - margin.right, // 计算宽度height = window.innerHeight * 0.95 - margin.top - margin.bottom; // 计算高度// 格式化和颜色比例尺
    var formatNumber = d3.format(",.0f"), // 格式化数字的函数format = function(d) { return formatNumber(d); }, // 定义格式化函数color = d3.scale.category20(); // 创建颜色比例尺// 创建一个SVG元素并将其附加到图表div中
    var svg = d3.select("#chart").append("svg") // 选择图表元素,并添加SVG元素.attr("width", width + margin.left + margin.right) // 设置SVG宽度.attr("height", height + margin.top + margin.bottom) // 设置SVG高度
    .append("g") // 添加一个分组元素.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // 设置图表的偏移量
    
  • 初始化Sankey图布局
    // 初始化Sankey图布局
    var sankey = d3.sankey() // 创建Sankey布局.nodeWidth(30) // 设置节点宽度.nodePadding(5) // 设置节点间距.size([width, height]); // 设置布局大小var path = sankey.link(); // 为链接定义路径生成器// 在Sankey图中设置节点、链接和布局
    sankey.nodes(json.nodes) // 设置节点数据.links(json.links) // 设置链接数据.layout(32); // 执行布局计算
    
  • 链接links绑定
    // 创建链接并绑定数据
    var link = svg.append("g").selectAll(".link") // 创建链接的选择集.data(json.links) // 绑定数据
    .enter().append("path") // 进入更新.attr("class", "link") // 添加class.attr("d", path) // 设置路径.style("stroke-width", function(d) { return Math.max(1, d.dy); }) // 设置描边宽度.sort(function(a, b) { return b.dy - a.dy; }); // 根据数据大小排序
    
  • 节点nodes设置
    // 创建节点并绑定数据
    var node = svg.append("g").selectAll(".node") // 创建节点的选择集.data(json.nodes) // 绑定数据.enter().append("g") // 进入更新.attr("class", "node") // 添加class.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }) // 设置节点位置.call(d3.behavior.drag() // 添加拖动行为.origin(function(d) { return d; }) // 定义起始位置.on("dragstart", function() { this.parentNode.appendChild(this); }) // 开始拖动时将节点置于顶层.on("drag", dragmove)); // 拖动时的处理函数// 节点颜色数组var colorArray = ["#00577f", "#439083", "#aa5723", /* ... */ ]; // 节点颜色数组// 为节点创建矩形node.append("rect") // 添加矩形元素.attr("height", function(d) { return d.dy; }) // 设置高度.attr("width", sankey.nodeWidth()) // 设置宽度.style("fill", function(d, i) { return colorArray[i % colorArray.length]; }) // 设置填充颜色.style("stroke", function(d, i) { return d3.rgb(colorArray[i % colorArray.length]).darker(0); }) // 设置描边颜色.append("title"); // 添加标题元素// 为节点添加标签node.append("text") // 添加文本元素.attr("x", -6) // 设置x坐标.attr("y", function(d) { return d.dy / 2; }) // 设置y坐标.attr("dy", ".35em") // 设置dy属性.attr("text-anchor", "end") // 设置文本锚点.attr("transform", null) // 重置变换.text(function(d) { return d.name; }) // 设置文本内容.filter(function(d) { return d.x < width / 2; }) // 过滤条件.attr("x", 6 + sankey.nodeWidth()) // 设置x坐标.attr("text-anchor", "start"); // 设置文本锚点
    
  • 悬浮框动作触发设置
    // 当鼠标悬停在节点上时显示悬浮框
    node.on("mouseover", function(d) {d3.select("#tooltip").style("left", (d3.event.pageX) + "px").style("top", (d3.event.pageY - 28) + "px").style("opacity", 0.9).html(d.name + ": " + format(d.value));});// 鼠标移出节点的时候隐藏自定义悬浮框
    node.on("mouseout", function(d) {d3.select("#tooltip").style("opacity", 0);
    });// 在鼠标悬浮在链接上的时候显示自定义悬浮框
    link.on("mouseover", function(d) {d3.select("#tooltip").style("left", (d3.event.pageX) + "px").style("top", (d3.event.pageY - 28) + "px").style("opacity", 0.9).html(d.source.name + " → " + d.target.name + ": " + format(d.value));
    });// 鼠标移出链接的时候隐藏自定义悬浮框
    link.on("mouseout", function(d) {d3.select("#tooltip").style("opacity", 0);
    });
    
  • 节点拖动功能实现
    // 通过拖动行为移动节点
    function dragmove(d) {d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")");sankey.relayout();link.attr("d", path);
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯(C++ 左移右移 买二增一 松散子序列 填充 有奖问答 更小的数 )

目录 左移右移 思路&#xff1a; 代码&#xff1a; 买二增一 思路&#xff1a; 代码&#xff1a; 松散子序列 思路&#xff1a; 代码&#xff1a; 填充 思路&#xff1a; 代码 &#xff1a; 有奖问答 思路&#xff1a; 代码&#xff1a; 更小的数 思路&#…

3dmax贴视频纹理

1、准备视频文件 需要avi格式的视频文件 2、创建模型 3、添加纹理 纹理选择avi视频 4、播放

四川尚熠电子商务有限公司引领抖音电商新潮流

随着抖音的火爆&#xff0c;越来越多的商家开始重视抖音电商服务&#xff0c;希望在这个庞大的平台上掘金。四川尚熠电子商务有限公司作为一家专业的抖音电商服务商&#xff0c;凭借其独特的运营策略和专业的服务团队&#xff0c;成为了商家在抖音电商领域的可靠伙伴。 四川尚熠…

C/C++ LeetCode:跳跃问题

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 题目链接&#xff1a;45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元…

开源CRM客户管理系统-FeelCRM

FeelCRM客户管理系统 开源项目介绍 FeelCRM客户管理系统&#xff0c;符合中小企业业务流程&#xff1b;支持线索管理、客户管理、商机管理、合同管理、审核管理等多个模块&#xff1b;希望能为广大中小企业以及开发者们提供一个更多的可能性&#xff1b;本版本是我公司跨语言…

《从零开始制作消除游戏:基于Web技术的简单教程》

在撰写《从零开始制作消除游戏&#xff1a;基于Web技术的简单教程》这篇博客时&#xff0c;主要的目标是提供一个清晰、逐步的指南&#xff0c;帮助读者从零开始创建自己的消除游戏。 游戏逻辑实现 游戏板设计与初始化&#xff1a;描述如何创建游戏板的数据结构&#xff0c;以…

区间dp/线性dp,HDU 4293 Groups

一、题目 1、题目描述 After the regional contest, all the ACMers are walking alone a very long avenue to the dining hall in groups. Groups can vary in size for kinds of reasons, which means, several players could walk together, forming a group.   As the …

使用Halcon匹配助手进行模板匹配

使用Halcon匹配助手进行模板匹配 文章目录 使用Halcon匹配助手进行模板匹配1. 选择匹配方法2. 创建模板3. 检测模板4. 优化匹配速度 使用Halcon匹配助手&#xff0c;可以很方便地选择模板图像&#xff0c;设置匹配参数&#xff0c;并测试匹配结果.Halcon匹配助手支持下面几种匹…

静态独享长效IP的优点有哪些?静态独享长效IP有哪些应用场景?

随着互联网的不断发展&#xff0c;IP地址作为网络通信中的重要标识&#xff0c;其重要性日益凸显。静态独享长效IP作为一种特殊的IP地址类型&#xff0c;具有许多优点&#xff0c;适用于多种应用场景。本文将详细介绍静态独享长效IP的优点以及适用场景。 一、静态独享长效IP的优…

25考研每日的时间安排

今天要给大家分享一下25考研每日的时间安排。 没有完美的计划&#xff0c;只有合适的计划。 仅供参考 很多人说复习不要只看时长而是要看效率&#xff0c;所以学多长时间不重要&#xff0c;重要的高效率完成任务。 完美的计划 这个计划看起来很完美&#xff0c;从早到晚有学习…

关于MySQL的基本查询(多表查询等)

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下&#xff1a; CREATE…

体验华为云对话机器人服务 CBS

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、开通…

开源的API Gateway项目- Kong基于OpenResty(Nginx + Lua模块)

Kong 是一个在 Nginx 内运行的开源 API 网关和微服务抽象层。它是用于处理 API 流量的灵活、可扩展、可插入的工具。 Kong 提供了以下功能&#xff1a; 用户登录&#xff1a;Kong 提供了多种认证插件&#xff0c;像 JWT、OAuth 2.0 等&#xff0c;可以满足用户登录需求。Toke…

CSDN年度回忆录(扫码的官方数据版本)

引言 官方搞了个活动 就是扫码 查看年度报告的 我印象中 这方面做的最好的就是 支付宝 每年都可以看到自己的钱花在哪里了 今年数据大概率清一色饮食 都汤姆花在了炒股上 这两天A股有点逆转的样子 但是我想说&#xff0c;不要去&#xff08;他在骗你的压岁钱&#xff09; …

CSS 实现 flex布局最后一行左对齐的方案「多场景、多方案」

目录 前言解决方案场景一、子项宽度固定&#xff0c;每一行列数固定方法一&#xff1a;模拟两端对齐方法二&#xff1a;根据元素个数最后一个元素动态margin 场景二、子项的宽度不确定方法一&#xff1a;直接设置最后一项 margin-right:auto方法二&#xff1a;使用:after(伪元素…

多场景建模:阿里MARIA

Multi-scenario ranking framework with adaptmulti-scenario ranking framework with adaptive feature learning 背景 多模态搜索场景支持用户通过不同模态的Query来表达多样的搜索需求。 拍照搜索&#xff08;Visual Search&#xff09;&#xff1a;实拍图作为query相似商…

【Godot4自学手册】第六节实现人物的挥剑操作

同学们好&#xff01;本节学习一下人物挥剑操作。 一、将鼠标左键单击设为输入映射 单击项目选择项目设置&#xff0c;在添加新动作填写sword&#xff0c;然后点击添加。在动作列表中,单击sword后面的加号&#xff0c;在弹出对话框中单击鼠标左键&#xff0c;最后单击确定&am…

Flink Checkpoint 超时问题和解决办法

第一种、计算量大&#xff0c;CPU密集性&#xff0c;导致TM内线程一直在processElement&#xff0c;而没有时间做CP【过滤掉部分数据&#xff1b;增大并行度】 代表性作业为算法指标-用户偏好的计算&#xff0c;需要对用户在商城的曝光、点击、订单、出价、上下滑等所有事件进…

Linux--基础开发工具篇(1)(yum)

1.Linux 软件包管理器 yum 1.1yum是什么&#xff1f;什么是软件包&#xff1f; yum是什么&#xff1f; yum是一个软件下载安装管理的一个客户端&#xff0c;就如小米应用商店&#xff0c;华为应用商城。 Linux中软件包可能有依赖关系--yum会帮助我们解决依赖关系的问题。 什么是…

使用OpenCV实现一个简单的实时人脸跟踪

简介&#xff1a; 这个项目将通过使用OpenCV库来进行实时人脸跟踪。实时人脸跟踪是一项在实际应用中非常有用的技术&#xff0c;如视频通话、智能监控等。我们将使用OpenCV中的VideoCapture()函数来读取视频流&#xff0c;并使用之前加载的Haar特征级联分类器来进行人脸跟踪。 …