d3.js 入门指南

  说到数据可视化,我们会行到很多优秀的框架,像echarts、highcharts,这些框架很优雅,健壮,能满足我们对可视化的大部分需求,但是缺点也很明显,就是这些框架几乎是不可定制化的,当遇到特殊的需求,那就太难了。这个时候,聪明的小伙伴会转而学习一些基础的,定制化程度更高的框架,而其中最杰出的就是D3.js,由于我是专为北京地铁定制化软件,经常会用到数据可视化,废话不多说先上北京地铁路网,因为今天是入门教程,但是我不想讲svg基础知识,只讲一点基础内容饼图,大佬请绕行。

1.绘制饼图的预备知识

  1. 1.比例尺的使用
  2. 2.饼图布局的使用
  3. 3.弧生成器的使用

1.比例尺的使用

  d3中有很多种比例尺,其中有四种经常使用,分别是scaleLinear线性比例尺,scaleOrdinal序数比例尺,scaleBand序数段比例尺,scaleTime时间比例尺。今天我们只介绍序数比例尺。

const colorList = ["#ffa39e", "#eaff8f", "#87e8de", "#ffd591", "#91d5ff", "#ffadd2", "#ffe58f"];
const color = d3.scaleOrdinal().domain(colorList.map((d,i) => i)).range(colorList)

使用序数比例尺将索引和颜色对应,如color(1) --> "#eaff8f"

2.饼图布局的使用

d3中同样有很多种布局,布局并没有绘制的作用,他只是将原始数据转换成绘制图形所需要的数据的方法。饼图布局就是将数据转换成绘制饼图所需要的数据,如startAngle,endAngle,index,data等数据。

let pie = d3.pie().sort(null).value(d => d.number);

  sort方法是先将传入方法的数据做排序处理,默认降序,null参数,即保留原数据局顺序。
  value方法是选择布局要处理的数据,即按照传入对象的number属性值排序。既然布局是一个方法,那么试用起来非常简单

var pieData = pie(dataset);

  这里pieData就是我们需要的数据

3.弧生成器的使用

  d3中大部分图形都是通过path绘制的,弧生成器,就是将数据绘制出path的d属性。

let arc = d3.arc().innerRadius(100).outerRadius(200);

  innerRadius为绘制弧的内径,outerRadius为绘制弧的内径,使用方式如下

arc({startAngle: 0, endAngle: 2})

  因为我们的布局就是将数据处理成startAngle,endAngle这种形式,那么画出饼图就变得非常简单

selection.data(pieData).enter().append('path').attr('d', (d) => arc(d))

  这就生成了一个饼图。

2.完整的画一个饼图

1.分组

  想做好一个d3的项目,分析必不可少,好的分组能代码更简洁优雅。饼图大致分四个部分

  1. 弧形部分
  2. 虚线部分
  3. 文字部分
  4. 中心详情部分
group.append('g').attr('class', 'pies');
group.append('g').attr('class', 'lines');
group.append('g').attr('class', 'texts');
const centersT = group.append('g').append('text').attr('x', 0).attr('y', 0).attr('text-anchor', 'middle').attr('dy', '-1.6em').attr('font-size', 30).attr('fill', 'none').attr('stroke', '#888').text('');
const centersC = group.append('g').append('text').attr('x', 0).attr('y', 0).attr('text-anchor', 'middle').attr('dy', '0em').attr('font-size', 30).attr('fill', 'none').attr('stroke', '#888').text('');
const centersB = group.append('g').append('text').attr('x', 0).attr('y', 0).attr('text-anchor', 'middle').attr('dy', '1.6em').attr('font-size', 30).attr('fill', 'none').attr('stroke', '#888').text('');

  这里中心详情部分我为了简单就没有分组。只把三大块分了组。

2.生成数据方法

const initData = () => {dataset = dataset.map( d => {return {name: d.name,number: Math.floor(Math.random() * 1000 + 100)}})
}

3.使用merge()方法将数据更新。

  merge()方法可以把update和enter部分的操作合一,更加方便数据更新。

let pathUpdate = group.select('.pies').selectAll('path.pie').data(pieData)
let pathEnter = pathUpdate.enter().append('path');
pathEnter.merge(pathUpdate).attr('fill', (d,i) => color(i)).attr('class', 'pie').attrTween('d', function (d) {return arc(d)})

4.绘制折线

  因为每次数据的变化势必会影响折线的位置,这里要做一些计算

let polylineUpdate = group.select('.lines').selectAll('polyline').data(pieData);
let polylineEnter = polylineUpdate.enter().append('polyline');polylineEnter.merge(polylineUpdate).attr('fill', 'none').attr('stroke', '#333').attr('stroke-dasharray', '5,5').attr('points', d => {let direction = (d.startAngle + d.endAngle < Math.PI * 2 ? 1 : -1);return [arc.centroid(d), arc.centroid(d)[0] * 1.6, arc.centroid(d)[1] * 1.6, (innerRadius + outerRadius) * direction, arc.centroid(d)[1] * 1.6]})

  这里的arc.centroid(d)为当前扇形的中心坐标,arc.centroid(d)[0]为x坐标,arc.centroid(d)[1]为y坐标。

(d.startAngle + d.endAngle < Math.PI * 2 ? 1 : -1);

  这段代码是判断扇形是属于左半面还是右半面。

5.加入一些动画。

  transition(动画)能让图形更加优雅的变化。这里主要是学习一下attrTween,直接看文档我就不多说了。具体代码请移步至饼图。

  后续将发布更多的教程。

 

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

 

 

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

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

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

相关文章

【LeetCode】200. 岛屿的个数

题目 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;计算岛屿的数量。一个岛被水包围&#xff0c;并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例 1:输入: 11110 110…

AI 模拟退火算法

模拟退火算法转载于:https://www.cnblogs.com/yangwenhuan/p/10548171.html

keep用法

keep 是英语中用法灵活的动词之一&#xff0c;下面笔者就其用法归纳如下&#xff1a; 一、用作系动词&#xff0c;意为“保持&#xff08;某种状态&#xff09;”&#xff0c;其后常接形容词作表语。如&#xff1a; Please keep quiet / silent! 请保持安静&#xff01; Aft…

Kubernetes系列之Helm介绍篇

本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版&#xff0c;安装包地址请到公众号内回复【K8s实战】获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts。有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。Helm…

HTNL笔记整合

简述概括了HTML 的部分内容&#xff0c;不是很完善&#xff0c;希望能给予你们相对的帮助。 一下文件的整合百度云链接&#xff1a;HTML整合笔记 第一章 HTML入门 课时1&#xff1a;HTML初识 1、英文名&#xff08;Hyper Text Markup Language&#xff09;超文本标签语言 对…

EXCEL 图表 只在拐点的时候显示数字

EXCEL图表只在折线的拐点显示数值&#xff0c;中间不需要显示。同时往下拐的&#xff0c;显示在上方&#xff0c;往上的显示在下方&#xff0c;这样数值不会挡住线。 首先&#xff0c;做一些模拟数据 因为起点和终点数值必须显示&#xff0c;所以单元格&#xff0c;C2 D2 C19 D…

浅谈Vue之双向绑定

VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。那么Object.defineProperty究竟是该如何使用的呢&#xff1f;先看个例子 <!DOCTYPE html> <html lang"en"><h…

【AtCoder】AGC017

A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数&#xff0c;直接转移即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar…

SQL语法(1、安装操作)

1、数据库的系统概述及安装与基本使用 bilibili可查找安装视频百度了解一下 – 使用超级管理员登录 CONN sys/change_on_install AS SYSDBA ; – 创建c##scott用户 CREATE USER c##scott IDENTIFIED BY tiger ; – 为用户授权 GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE…

java 中文字符和unicode编码值相互转化

java 中文字符和unicode编码值相互转化 https://blog.csdn.net/u011366045/article/details/79235217 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/u011366045/article/details/792352171、引用工具 import com.alibaba.…

Object 及toString() 方法的重写

Object: 是所有的类的父类 &#xff0c;Object中所有的方法 &#xff0c; 子类都能使用 &#xff0c; 接口不是Object子类。 Person: /*将父类的equals方法 重写* 不改变父类的源代码 equals 比较内存地址* 比较两个成员变量 变量值相等 返回true 不等 返回false* 重…

SQL语法练习

SQL语法练习https://blog.csdn.net/qq_30764991/article/details/81952197员工表建表语句: CREATE TABLE EMP ( ENAME VARCHAR2(30), EMPNO NUMBER(5), DEPTNO NUMBER(5), JOB VARCHAR2(20), HIREDATE DATE, COMM NUMBER(6,2), SAL NUMBER(6,2) ); 部门表建表语句: CREATE TA…

第22章:MongoDB-聚合操作--聚合管道--$out

①$out$out&#xff1a;利用此操作可以将查询结果输出到指定的集合里面。②范例&#xff1a;将投影的结果输出到集合里③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳转载于:https://www.cnblogs.com/Lucky-stars/p/10555296.html

SQL简单查询

1、简单查询 使用Oracle sql developer使用前&#xff0c;必须开启的服务&#xff1a; 查询emp表上的数据&#xff1a; select * from emp; Null为空&#xff0c;空不代表等于没有&#xff0c;null&#xff01;0. 重新连接后&#xff0c;注意大小写及空格位&#xff01; 简…

实用小技巧(一):UIScrollView中上下左右滚动方向的判断

https://www.jianshu.com/p/93e8459b6dae 2017.06.01 01:13* 字数 674 阅读 1201评论 0喜欢 12017.06.01 01:13* 字数 674 阅读 1201评论 0喜欢 1 版本记录 版本号 时间 V1.0 2017.05.31 前言 ios中又很多实用的小技巧&#xff0c;实现不难很实用&#xff0c;以后我会慢慢的…

less.js

1.变量 2.混入 3.带参的混入 4.选择器的继承&#xff0c;貌似还不支持 5.嵌套规则 6.运算 7.颜色函数 8.条件语句与控制&#xff0c;貌似不支持 9.命名空间 10.注释 11.作用域 12.字符的插入 13.转义 14.JavaScript 的赋值转载于:https://www.cnblogs.com/I-am-fine/archive/20…

SQL限定查询

1、限定查询与排序显示 1.1限定查询的认识&#xff1a; 列&#xff1a;表中有大数据的信息&#xff0c;对数据进行筛选&#xff0c;查询到自己想要的信息。 &#xff08;数据过多显示过慢&#xff0c;或者死机&#xff0c;在已有的样本数据库容器CDB转换为PDB之中&#xff09;…

Centos6.10源码部署zabbix-3.2.6

环境&#xff1a;Centos6.10 已有lnmp环境 mysql5.7 php7.2 创建zabbix数据库 mysql> create database zabbix character set utf8 collate utf8_bin; mysql> grant all privileges on zabbix.* to zabbixlocalhost identified by zabbix; 创建zabbix用户 shell> …

浅谈五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 导读&#xff1a;作者飞龙写了一篇《浅谈Python Web框架》&#xff0c;文中他介绍了几个Python Web框架和自己对选择框架的分析。在他看来&#xff0c;用Django来快速开发一些Web运用是很不错的选择。以下是文章内容&#xff1a…

主流浏览器和内核及Web标准

目前网络市场的浏览器主流&#xff1a; 课时3&#xff1a;web标准 WEB标准 w3c 万维网联盟组织&#xff0c;制定web标准的机构。 网页主要由三部分组成&#xff1a; 结构&#xff08;Structure&#xff09;、 表现&#xff08;Presentation&#xff09; 行为&#xff08;Beh…