d3.js 入门指南 - 仪表盘

D3的全称是Data-Driven Documents(数据驱动的文档),是一个用来做数据可视化的JavaScript函数库,而JavaScript文件的后缀通常为.js,所以D3被称为D3.js。

d3.js可以定制出各种图形,今天来用d3.js制作一个简易的仪表盘,废话不多说先上demo,接下来分步讲解。

1.绘制svg,并分组(group)

const height = 600; //画布高度
const width = 1200; //画布宽度
const outerRadius = 200; //仪表盘外半径
const innerRadius = 190; //仪表盘内半径
const svg = d3.select('body').append('svg').attr('width', width).attr('height', height).style('background', '#000000'); // 在body中添加宽高并绘制背景色
const group = svg.append('g').attr('class', 'group').attr('transform', `translate(${width * 0.5}, ${height * 0.5})`); //添加分组并将分组中心移至画布中心
const arc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius) //编写弧生成器并传入内外半径
const keduListB = [0,1,2,3,4,5,6,7,8,9,10,11,12]; //(大)刻度的数组
const keduListS = [0,1,2,3,4,5,6,7,8,9,10,11]; //(小)刻度的数组
const radiusScaleB = d3.scaleLinear().domain([0, 12]).range([Math.PI * (- 2 / 3), Math.PI * 2 / 3]) //(大)刻度线性比例尺
const radiusScaleS = d3.scaleLinear().domain([0, 11]).range([Math.PI * (- 11 / 18), Math.PI * ( 11 / 18 )]) //(小)刻度线性比例尺
let baseData = 0; //设置基础速度

2.将内容分组

group.append('g').attr('class', 'pan') //绘制仪表盘的圆弧分组
group.append('g').attr('class', 'kedu_b') //绘制大刻度分组
group.append('g').attr('class', 'kedu_s') //绘制小刻度分组
group.append('g').attr('class', 'zhizhen') //绘制指针分组
group.append('g').attr('class', 'shuzi') //绘制刻度数字分组
group.append('g').attr('class', 'show') //绘制速度框和数字分组
group.append('g').attr('class', 'button') //绘制按钮框和数字分组

3.绘制仪表盘的圆弧

group.select('.pan').append('path').attr('d', arc({startAngle: radiusScaleB(0),endAngle: radiusScaleB(12)})).attr('fill', '#6AE3F8').attr('stroke', '#6AE3F8');

4.绘制大刻度

group.select('.kedu_b').selectAll('line').data(keduListB).enter().append('line').attr('x1', d => 200 * Math.sin(radiusScaleB(d))).attr('y1', d => 200 * Math.cos(radiusScaleB(d)) * -1).attr('x2', d => 176 * Math.sin(radiusScaleB(d))).attr('y2', d => 176 * Math.cos(radiusScaleB(d)) * -1).attr('stroke', '#6AE3F8').attr('stroke-width', 5)

5.绘制小刻度

group.select('.kedu_s').selectAll('line').data(keduListS).enter().append('line').attr('x1', d => 200 * Math.sin(radiusScaleS(d))).attr('y1', d => 200 * Math.cos(radiusScaleS(d)) * -1).attr('x2', d => 180 * Math.sin(radiusScaleS(d))).attr('y2', d => 180 * Math.cos(radiusScaleS(d)) * -1).attr('stroke', '#6AE3F8').attr('stroke-width', 2)

6.绘制刻度数字

group.select('.shuzi').selectAll('text').data(keduListB).enter().append('text').attr('x', d => 160 * Math.sin(radiusScaleB(d))).attr('y', d => 160 * Math.cos(radiusScaleB(d)) * -1).attr('text-anchor', 'middle').attr('dy', '0.35em').attr('fill', '#6AE3F8').style('text-shadow', '0px 0px 2px #6AE3F8').text(d => d * 20)

7.绘制指针

group.select('.zhizhen').append('polygon').attr('points', '-2,-20,2,-20,4,0,1,140,-1,140,-4,0').attr('fill', '#6AE3F8').attr('transform', 'rotate(60)')

8.绘制速度框和数字

group.select('.show').attr('transform', 'translate(0, 100)').append('rect').attr('x', -60).attr('y', 0).attr('width', 120).attr('height', 40).attr('fill', 'none').attr('stroke', '#6AE3F8').attr('stroke-width', 3)
group.select('.show').append('text').attr('text-anchor', 'middle').attr('x', 0).attr('y', 20).attr('dy', '0.35em').attr('fill', '#6AE3F8').attr('stroke', '#6AE3F8').attr('font-size', '20px').text(`0 km/h`)

9.绘制按钮框和数字

d3.select('.button').append('rect').attr('x', -50).attr('y', 250).attr('width', 100).attr('height', 40).attr('fill', 'none').attr('stroke', '#6AE3F8').attr('stroke-width', 2)d3.select('.button').append('text').attr('x', 0).attr('y', 270).attr('text-anchor', 'middle').attr('dy', '.35em').attr('fill', '#6AE3F8').attr('font-size', '20px').text('加速')

10.速度不断减小,并且点击“加速”持续加速

d3.select('.button').attr('cursor', 'pointer').on('click', () => {if (baseData < 220) {baseData += 20change()} else if (baseData < 240) {baseData = 240;change()}})
setInterval(() => {if (baseData > 10) {baseData -= 10;change();} else if (baseData > 0) {baseData = 0;change()}
}, 2000)

11.控制加速的方法(指针旋转,速度数字增加)

const change = () => {group.select('.zhizhen').transition().duration(2000).ease(d3.easeLinear).attrTween('transform', function () {this._before = typeof this.getAttribute('transform') == 'string' ? this.getAttribute('transform').match(/\d+/g)[0] : 0;this._after = baseData;console.log('this._before',this._before)console.log('this._after',this._after)let interpolate = d3.interpolate(this._before, this._after);return function(t) {texts(interpolate(t))return `rotate(${interpolate(t)})`};})}const texts = text => {group.select('.show').select('text').attr('text-anchor', 'middle').attr('x', 0).attr('y', 20).attr('dy', '0.35em').attr('fill', '#6AE3F8').attr('stroke', '#6AE3F8').attr('font-size', '20px').text(`${Math.floor(text)} km/h`)
}

这样点击加速就会调用change()方法,而change()方法在过渡是就会调用texts()方法。
这样子就好了,一个基本的仪表盘就绘制好了

 

原创博客:转载请注明d3.js 入门指南 - 仪表盘

转载于:https://www.cnblogs.com/vadim-web/p/11289319.html

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

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

相关文章

[转帖]华为的“大海思”与“小海思”

华为的“大海思”与“小海思” https://www.cnbeta.com/articles/tech/828275.htm没先到华为海思这么狠.. 作为华为的全资子公司&#xff0c;说起海思半导体&#xff0c;大家可能第一时间会想起麒麟处理器。经过多年的持续的研发投入&#xff0c;华为海思自研的麒麟处理器现在确…

H5第三天(1)

响应式布局 ☞核心知识点 less媒体查询 学习目标 掌握less基本语法能够使用less编写css代码能够掌握媒体查询能够使用媒体查询实现响应式布局 Less介绍 维护CSS的弊端 CSS本质上不是一门语言,是一个简单的样式表.代码维护相对老套,不够灵活.LESS介绍 ☞LESS预处理器: 依…

CocosPods 引入项目,哪些文件需要上传到服务器呢?

以上除Podfile外&#xff0c;其它三个文件都不是必须提交的。其中Pods目录没必要提交&#xff0c;里面的文件都是根据Podfile描述的依赖库的配置信息下载和生成的文件。因为CocoaPods支持语义化版本号&#xff0c;所以需要Podfile.lock文件记住当前使用的版本&#xff0c;当然这…

H5第三天(2)

移动web响应式布局 ☞知识点-回顾 1. 什么是弹性盒子(伸缩布局) 2. 伸缩布局解决了什么问题 3. 伸缩盒子特点 有一条默认水平显示的主轴有一条始终要垂直于主轴的侧轴 4.重点掌握的属性 设置伸缩盒子 display: flex;设置主轴对齐方式 justify-content设置侧轴对齐方式 a…

X-AdminABP框架开发-系统日志

网站正常运行中有时出现异常在所难免&#xff0c;查看系统运行日志分析问题并能够根据错误信息快速解决问题尤为重要&#xff0c;ABP对于系统运行日志这块已经做了很好的处理&#xff0c;默认采用的Log4Net已经足够满足开发过程中的需要了(当然有需要的话也可以更换为其它日志组…

[Swift]LeetCode826. 安排工作以达到最大收益 | Most Profit Assigning Work

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

H5第四天(1)

boostrap框架介绍 核心知识点 boostrap框架栅格系统[重点,不是难点]基本的全局样式 学习目标 能够使用boostrap框架中的基本样式能够使用栅格系统完成阿里百秀案例 boostrap框架 介绍 https://www.bootcss.com/ Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架&#xff0c;用…

javascript基础入门知识点整理

学习目标:- 掌握编程的基本思维- 掌握编程的基本语法 typora-copy-images-to: mediaJavaScript基础 HTML和CSS 京东 课前娱乐 众人皆笑我疯癫,我笑尔等看不穿 课前说明 目标&#xff1a;掌握编程的基本思想掌握JavaScript的基础语法,使用常见API(备注)完成相应案例及练习和作业…

学习笔记-canny边缘检测

Canny边缘检测 声明&#xff1a;阅读本文需要了解线性代数里面的点乘&#xff08;图像卷积的原理&#xff09;&#xff0c;高等数学里的二元函数的梯度&#xff0c;极大值定义&#xff0c;了解概率论里的二维高斯分布 1.canny边缘检测原理和简介 2.实现步骤 3.总结 一、 Canny边…

H5第四天(2)

Bootstrap框架 Bootstrap框架 为什么要学Bootstrap框架 Bootstrap框架: 为我们提供了用来实现响应式开发的公共资源 总结: Bootstrap框架用来实现响应式布局Bootstrap框架中重点学什么 Bootstrap框架提供了很多丰富的网页开发资源,代码有上万行代码.1. 重点学习框架中提供的基…

javascript高级实战学习

学习目标:- 理解面向对象开发思想- 掌握 JavaScript 面向对象开发相关模式- 掌握在 JavaScript 中使用正则表达式- typora-copy-images-to mediaJavaScript 高级 课程介绍 课程大纲 在线地址&#xff1a;JavaScript 高级 目标 理解面向对象开发思想 掌握 JavaScript 面向对象…

H5C3笔记微整合

传统布局&#xff08;宽度百分比设置&#xff09; 伸缩布局&#xff08;flex&#xff09; 自适应布局&#xff08;lessrem媒体查询&#xff09; 1、less的使用 2、rem的使用 我的理解&#xff1a; 1、假如想把ui 给的图片设置在网页上&#xff0c;给网页设置个份额值为 x 2、…

如何开发出优秀的APICloud应用

APICloud定制平台项目实施规范APICloud应用优化策略Top30如何开发出运行体验良好、高性能的App如何开发出客户满意、能够顺利交付的App1. 引擎或模块问题&#xff1a; 遇到应用层无法解决的问题&#xff0c;如果能确定需要引擎和模块支持的&#xff0c;不要自己想办法绕过去&am…

收破烂怎么入行

收破烂分为几个环节。1、回收&#xff08;回收利用、消息传递&#xff0c;消息处理&#xff09;2、集中处理&#xff08;垃圾分类&#xff0c;垃圾测试&#xff0c;垃圾投入使用&#xff0c;成品&#xff09;3、应用&#xff08;垃圾回收再应用&#xff0c;提供给需要资源的单位…

javaScript第一天(2)

javaScript基础 1. javaScript的由来【了解】 为什么会出现js 早期出现js的原因就是为了解决一个问题: 用户和浏览器(网页)进行交互其他了解: 系统程序员Brendan Eich 设计了js语言, js语言1借鉴C语言的基本语法; (2)借鉴Java语言的数据类型和内存管理; (3)借鉴Scheme语言&…

WC2018 通道

好久以前开的坑&#xff0e; 到今天才填上&#xff0e; 首先考虑队第一颗树边分&#xff0c;然后分成两个集合\(L,R\)&#xff0c;在第二棵树上建出虚树&#xff0c;在每个路径\(lca\)处统计答案&#xff0c;维护点集的直径只有正权很好维护&#xff0e; #include <bits/std…

javaScript第一天(1)

01-JavaScript基础 核心知识点 javaScript书写位置javaScript变量javaScript数据类型javaScript数据类型转换javaScript运算符 今日学习目标 能够定义一个变量并完成变量的赋值能够说出每一种具体的数据类型能够数据类型之间的相互转化能够掌握各种运算符的作用 序言 Java…

javaScript第二天(1)

02-JavaScript基础 1.核心知识点 运算符分支语句 【重点】断点调试 [查看程序逻辑的一个技能] 2.今日学习目标 能够掌握js中相关的运算符 能够掌握理解算数运算符使用及特点能够掌握赋值运算符的使用及特点能够掌握一元运算符的使用及特点能够掌握比较运算符的特点,理解等于…

第四周总结

第四周作业 这次作业属于哪个课程C语言程序设计这个作业要求在哪里第四周作业我的课程目标全部学会这个作业在那个具体方面帮助我实现目标深入了解二维数组参考文献教科书一&#xff0c;基础作业 程序填空题5-1 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素&#xff0c;如果方…

2019春季学期第四周作业

2019春季学期第四周作业 这个作业属于那个课程C语言程序设计Ⅰ这次作业要求在哪里2019春季学期第四周作业我在这个课程的目标是我希望能够更加掌握循环和排序参考文献无选择法排序 本题要求将给定的n个整数从大到小排序后输出。输入格式&#xff1a; 输入第一行给出一个不超过1…