利用D3.js实现数据可视化的简单示例

目录

一、D3.js选择器

二、数据绑定相关方法

三、DOM操作方法

四、事件监听

五、实现折线图案例

1.首先引入 D3.js 库。

2.然后获取数据(这里定义了销售数据数组作为数据)。

3.接着创建一个 svg 元素作为画布

4.定义 x 轴和 y 轴的比例尺,x 轴使用 scaleBand 比例尺来处理离散的月份数据,y 轴使用 scaleLinear 比例尺根据销售金额的范围来确定坐标范围

5.分别添加 x 轴和 y 轴到 svg 画布上。

6.定义折线生成器

7.使用数据绘制折线和数据点

8.监听事件并添加处理函数


使用D3.js过程中,我们一般需要创建画布、绑定数据、选择元素、操作元素、监听元素事件等,因此,需要先了解D3.js的选择器、数据绑定方式、DOM操作方法、事件监听等。

一、D3.js选择器

1. d3.select() :. 

   - 选择第一个匹配的 DOM 元素。

   - 用法:`d3.select(selector)`,其中 `selector` 是 CSS 选择器字符串。

2. d3.selectAll() :

   - 选择所有匹配的 DOM 元素。

   - 用法:`d3.selectAll(selector)`,其中 `selector` 是 CSS 选择器字符串。

二、数据绑定相关方法

1.enter() :

   - 为数据绑定过程中未匹配的元素创建新的 DOM 元素。

   - 用法:`selection.enter()`。

2.exit() :

   - 为数据绑定过程中多余的元素(即数据减少时)提供操作。

   - 用法:`selection.exit()`。

3.data() :

   - 将数据绑定到 DOM 元素上。

   - 用法:`selection.data(data)`,其中 `data` 是要绑定的数据。

三、DOM操作方法

1.attr() :

   - 获取或设置 DOM 元素的属性。

   - 用法:`selection.attr(name, value)`。

2.style() :

   - 获取或设置 DOM 元素的样式。

   - 用法:`selection.style(name, value)`。

3.text() :

   - 获取或设置 DOM 元素的文本内容。

   - 用法:`selection.text(value)`。

4.html() :

   - 获取或设置 DOM 元素的 HTML 内容。

   - 用法:`selection.html(value)`。

5.append() :

    - 在选定的元素中添加新的子元素。

    - 用法:`selection.append(name)`,其中 `name` 是新元素的标签名。

6.remove() :

    - 移除选定的元素。

    - 用法:`selection.remove()`。

四、事件监听

1.on() :

    - 为 DOM 元素添加事件监听器。

    - 用法:`selection.on(eventName, listener)`。

五、实现折线图案例

DOCTYPE html><html lang="en">
<head><meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>D3.js实现折线图案例title><style>svg {width: 600px;height: 400px;border: 1px solid #ccc;}style>
head>
<body><script src="https://d3js.org/d3.v7.min.js">script>  <script>// 销售数据const salesData = [      { month: 'Jan', amount: 12000 },      { month: 'Feb', amount: 15000 },      { month: 'Mar', amount: 18000 },      { month: 'Apr', amount: 16000 },      { month: 'May', amount: 20000 },      { month: 'Jun', amount: 22000 }    ];// 定义 svg 画布const svg = d3.select('body').append('svg');// 定义 x 轴比例尺const xScale = d3.scaleBand().domain(salesData.map(d => d.month)).range([0, 500]).padding(0.2);// 定义 y 轴比例尺const yScale = d3.scaleLinear().domain([0, d3.max(salesData, d => d.amount)]).range([300, 0]);// 添加 x 轴svg.append('g').attr('transform', 'translate(50,300)').call(d3.axisBottom(xScale));// 添加 y 轴svg.append('g').attr('transform', 'translate(50,0)').call(d3.axisLeft(yScale));// 添加折线const line = d3.line().x(d => xScale(d.month) + 25).y(d => yScale(d.amount));svg.append('path').datum(salesData).attr('fill', 'none').attr('stroke', 'steelblue').attr('stroke-width', 2).attr('d', line);// 添加数据点svg.selectAll('.dot').data(salesData).enter().append('circle').attr('class', 'dot').attr('cx', d => xScale(d.month) + 25).attr('cy', d => yScale(d.amount)).attr('r', 5)     .attr('fill', 'blue');// 添加提示框(简单示例,未完整实现交互)svg.selectAll('.dot').on('mouseover', function (event, d) {d3.select(this).attr('r', 8);// 这里可以进一步完善提示框内容和样式的显示 console.log(`Month: ${d.month}, Amount: ${d.amount}`);}).on('mouseout', function (event, d) {d3.select(this).attr('r', 5);});script>
body>
html>

1.首先引入 D3.js 库。

    <script src="https://d3js.org/d3.v7.min.js">script>  <script>

2.然后获取数据(这里定义了销售数据数组作为数据)。

3.接着创建一个 svg 元素作为画布

    const svg = d3.select('body').append('svg');

4.定义 x 轴和 y 轴的比例尺,x 轴使用 scaleBand 比例尺来处理离散的月份数据,y 轴使用 scaleLinear 比例尺根据销售金额的范围来确定坐标范围

    // 定义 x 轴比例尺
    const xScale = d3.scaleBand()
     .domain(salesData.map(d => d.month))
     .range([0, 500])
     .padding(0.2);

  • d3.scaleBand():创建一个分带(离散)比例尺,适用于处理分类数据。
  • domain(salesData.map(d => d.month)):设置比例尺的输入域(Domain)。这里从salesData数组中提取每个数据对象的month属性,形成一个包含所有月份的数组作为输入域。
  • range([0, 500]):设置比例尺的输出范围(Range),将输入域映射到从 0 到 500 的区间。
  • padding(0.2):设置每个类别之间的间隔为带宽的 20%,避免数据标签相互重叠。

    // 定义 y 轴比例尺
    const yScale = d3.scaleLinear()
     .domain([0, d3.max(salesData, d => d.amount)])
     .range([300, 0]);


    const yScale = d3.scaleLinear()
     .domain([0, d3.max(salesData, d => d.amount)])
     .range([300, 0]);

  • d3.scaleLinear():创建一个线性比例尺,用于处理连续数据。
  • domain([0, d3.max(salesData, d => d.amount)]):设置输入域。这里输入域的下限是 0,上限是salesData数组中amount属性的最大值,通过d3.max函数计算得出。
  • range([300, 0]):设置输出范围。在 SVG 坐标系中,y 轴是从上到下递增的,所以这里将较大的数据值映射到较小的 y 坐标,范围是从 300(底部)到 0(顶部)。

5.分别添加 x 轴和 y 轴到 svg 画布上。

// 添加 x 轴
    svg.append('g')
     .attr('transform', 'translate(50,300)')
     .call(d3.axisBottom(xScale));

// 添加 y 轴
    svg.append('g')
     .attr('transform', 'translate(50,0)')
     .call(d3.axisLeft(yScale));

  • svg.append('g'):在 SVG 元素中添加一个<g>(分组)元素,用于容纳坐标轴的所有组件。
  • attr('transform', 'translate(50,300)'):对<g>元素应用平移变换,将其移动到坐标 (50, 300) 的位置。这是为了将 x 轴放置在合适的位置上。
  • call(d3.axisBottom(xScale)):调用d3.axisBottom函数创建一个底部坐标轴,并将xScale比例尺应用到该坐标轴上,然后将坐标轴添加到<g>元素中。
  • call(d3.axisLeft(yScale)) 调用d3.axisLeft函数创建一个左侧坐标轴,并将yScale比例尺应用到该坐标轴上,然后将坐标轴添加到<g>元素中。

6.定义折线生成器

// 添加折线
    const line = d3.line()
     .x(d => xScale(d.month) + 25)
     .y(d => yScale(d.amount));

    svg.append('path')
     .datum(salesData)
     .attr('fill', 'none')
     .attr('stroke', 'steelblue')
     .attr('stroke-width', 2)
     .attr('d', line);

  • d3.line():创建一个折线生成器。
  • x(d => xScale(d.month) + 25):定义折线在 x 方向上的坐标获取方式。对于每个数据点,通过xScale比例尺将月份数据映射到 x 坐标,并加上 25 是为了使折线稍微偏离坐标轴一点,让数据点在坐标轴刻度的中间位置。
  • y(d => yScale(d.amount)):定义折线在 y 方向上的坐标获取方式。通过yScale比例尺将销售金额数据映射到 y 坐标。
  • svg.append('path'):在 SVG 元素中添加一个<path>元素,用于绘制折线。
  • datum(salesData):将salesData数组绑定到<path>元素上。
  • attr('fill', 'none'):设置填充颜色为无。
  • attr('stroke', 'steelblue'):设置描边颜色为钢蓝色。
  • attr('stroke-width', 2):设置描边宽度为 2。
  • attr('d', line):将折线生成器生成的路径描述设置给<path>元素的d属性,从而绘制出折线。

7.使用数据绘制折线和数据点

// 添加数据点
    svg.selectAll('.dot')
     .data(salesData)
     .enter()
     .append('circle')
     .attr('class', 'dot')
     .attr('cx', d => xScale(d.month) + 25)
     .attr('cy', d => yScale(d.amount))
     .attr('r', 5)
     .attr('fill', 'blue');

  • svg.selectAll('.dot'):选择所有类名为.dot的元素。由于此时可能还没有这些元素,这一步主要是为后续的数据绑定和元素创建做准备。
  • data(salesData):将salesData数据绑定到选择的元素上。如果选择的元素数量少于数据点数量,enter()方法将用于创建新的元素。
  • enter():返回一个占位符选择集,用于创建新的元素来匹配多余的数据点。
  • append('circle'):为每个多余的数据点创建一个<circle>元素。
  • attr('class', 'dot'):为创建的<circle>元素设置类名为.dot
  • attr('cx', d => xScale(d.month) + 25):设置圆形的cx(圆心的 x 坐标)。通过xScale比例尺将数据中的月份转换为 x 坐标,并加上 25 使圆形位于坐标轴刻度中间。
  • attr('cy', d => yScale(d.amount)):设置圆形的cy(圆心的 y 坐标)。通过yScale比例尺将数据中的销售金额转换为 y 坐标。
  • attr('r', 5):设置圆形的半径为 5。
  • attr('fill', 'blue'):设置圆形的填充颜色为蓝色。

8.监听事件并添加处理函数

// 添加提示框(简单示例,未完整实现交互)
    svg.selectAll('.dot')
     .on('mouseover', function (event, d) {
        d3.select(this).attr('r', 8);
        // 这里可以进一步完善提示框内容和样式的显示
        console.log(`Month: ${d.month}, Amount: ${d.amount}`);
      })
     .on('mouseout', function (event, d) { 
       d3.select(this).attr('r', 5);
      });

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

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

相关文章

CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes

CSP/信奥赛C语法基础刷题训练&#xff08;23&#xff09;&#xff1a;洛谷P1217&#xff1a;[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 …

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

Kylin Server V10 下基于Sentinel(哨兵)实现Redis高可用集群

一、什么是哨兵模式 Redis Sentinel 是一个分布式系统,为 Redis 提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress)这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线信息,并使用投票协议(agreement protocols)来决定是否执行…

扩散模型从原理到实战 入门

diffusion-models-class-CN/unit1/README_CN.md at main darcula1993/diffusion-models-class-CN GitHub 你可以使用命令行来通过此令牌登录 (huggingface-cli login) 或者运行以下单元来登录&#xff1a; from huggingface_hub import notebook_loginnotebook_login() http…

阅读《先进引信技术的发展与展望》识别和控制部分_笔记

基本信息 题名&#xff1a;先进引信技术的发展与展望 作者&#xff1a; 张合;戴可人 发表时间&#xff1a;2023-07-20 可装定、可探测、可处理、可控制是灵巧引信设计的四项基本能力。与之对应&#xff0c;先进引信的基础研究涵盖了信息交联技术、末端探测技术、目标识别技术…

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程&#xff0c;通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom&#xff0c;根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据&#xff0c;可以使用通义千问&#xff0c;关于LinearScale与BandScale不懂的地方也可以在通义千…

Fakelocation Server服务器/专业版 ubuntu

前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu&#xff08;安装下载不再赘述&#xff09; sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&#xff0c;…

SMMU软件指南操作之流(stream)安全性和流标识

安全之安全(security)博客目录导读 目录 1、流安全性 2、流标识 2.1 什么是 StreamID? 2.2 SubstreamID 的作用 1、流安全性 SMMUv3 架构在没有实现 RME 设备分配的情况下,支持两种可选的安全状态,这由 SMMU_S_IDR1.SECURE_IMPL 报告。如果实现了 RME 设备分配,则通过…

Android仿前端分页组件pagination

仿前端pagination Android仿前端分页组件pagination 最近Android原生有个需求就是做个分页组件&#xff0c;不用上拉加载&#xff0c;因为数据量太大用户喜欢前端的方式&#xff0c;UI主要是拼凑比较简单&#xff0c;主要补充了一些判断越界和数据不全的细节&#xff0c;记录方…

贴代码框架PasteForm特性介绍之query,linkquery

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

深入理解下oracle 11g block组成

深层次说&#xff0c;oracle数据库的最少组成单位应该是块&#xff0c;一般默认情况下&#xff0c;oracle数据库的块大小是8kb&#xff0c;其中存储着我们平常所需的数据。我们在使用过程中&#xff0c;难免会疑问道&#xff1a;“oracle数据块中到底是怎样组成的&#xff0c;平…

万有引力定律和库仑定律:自然的对称诗篇

万有引力定律和库仑定律&#xff1a;自然的对称诗篇 在宇宙深邃的知识长河中&#xff0c;万有引力定律和库仑定律恰似两颗璀璨的明珠&#xff0c;闪耀着人类智慧与自然奥秘的光辉。 十七世纪&#xff0c;牛顿在对天体运行的深邃思索中&#xff0c;拨开重重迷雾&#xff0c;发现…

win10局域网加密共享设置

1、创建共享账户 我的电脑右键选择管理 选择本地用户和组 -> 用户 双击用户 在空白区域右键,新建用户 然后创建用户 点击创建后 2、设置网络 右下角网络右键

.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】

一、使用VSCode开发.NET项目 1、创建文件夹&#xff0c;使用VSCode打开 2、安装扩展工具 1>C# 2>安装NuGet包管理工具&#xff0c;外部dll包依靠它来加载 法1》&#xff1a;NuGet Gallery&#xff0c;注意要启动科学的工具 法2》NuGet Package Manager GUl&#xff0c…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…

【强化学习的数学原理】第03课-贝尔曼最优公式-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、例子&#xff1a;如何改进策略&#xff1f;二、最优策略和公式推导三、公式求解以及最优性四、最优策略的有趣性质五、本节课…

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…

【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感

本文将介绍如何使用LSTM训练一个能够创作诗歌的模型。为了训练出效果优秀的模型&#xff0c;我整理了来自网络的4万首诗歌数据集。我们的模型可以直接使用预先训练好的参数&#xff0c;这意味着您无需从头开始训练&#xff0c;即可在自己的电脑上体验AI作诗的乐趣。我已经为您准…

【Swift】运算符

文章目录 术语赋值运算符算数运算符基本四则算术运算符求余运算符一元负号运算符一元正号运算符 比较运算符三元运算符空合运算符区间运算符闭区间运算符半开区间运算符单侧区间运算符 逻辑运算符逻辑非运算符逻辑与运算符逻辑或运算符逻辑运算符组合计算 位运算符运算符优先级…