【小白入门】JavaScript(二)—— D3.js

【小白入门】JavaScript(二)—— D3.js目录 D3 是什么 D3 对 JavaScript 的简化 2 选择集与数据绑定 3 使用 d3 在 SVG 画布中绘图 4 比例尺的使用 4 1 线性比例尺 4 2 序数比例尺 D3 是什么 D3 的全称是 Data DrivenDocume 顾名思义可以知道是一个被数据驱动的文档 D3 的本质是 JavaScript 所以用 JavaScript 可以实现它全部的功能 但是有这个函数库可以极大的减少工作量 尤其在数据可视化方面 D3 对 JavaScript 的简化基本 JavaScript 代码实现文本替换

D3是什么?

D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档。

D3的本质是JavaScript,所以用JavaScript可以实现它全部的功能,但是有这个函数库可以极大的减少工作量,尤其在数据可视化方面。

D3对JavaScript的简化

基本JavaScript代码实现文本替换:

<html> <head> <meta charset="utf-8"> <title>HelloWorld 
     title>  
      head> <body> <p>Hello World 1 
       p> <p>Hello World 2 
        p> <script> var paragraphs = document.getElementsByTagName("p"); for (var i = 0; i < paragraphs.length; i++) { 
         var paragraph = paragraphs.item(i); paragraph.innerHTML = "I like dog."; }  
         script>  
          body>  
           html> 

用D3简化;

<html> <head> <meta charset="utf-8"> <title>HelloWorld 
     title>  
      head> <body> <p>Hello World 1 
       p> <p>Hello World 2 
        p> <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"> 
         script> <script> d3.select("body").selectAll("p").text("www.ourd3js.com");  
          script>  
           body>  
            html> 

2.选择集与数据绑定

可以看到,D3的使用是链式语法,通过连续不断地调用函数来实现。

使用d3.select()d3.selectAll()选择元素后返回的对象,就是选择集。

选择集的常见用法如下:

var body = d3.select("body"); //选择文档中的body元素 var p1 = body.select("p"); //选择body中的第一个p元素 var p = body.selectAll("p"); //选择body中的所有p元素 var svg = body.select("svg"); //选择body中的svg元素 var rects = svg.selectAll("rect"); //选择svg中所有的svg元素 

如何绑定数据
D3可以将数据绑定到DOM上。绑定之后,当需要依靠这个数据才能操作元素的时候,就会更加方便。
D3中是通过以下两个函数来绑定数据的:




  • datum() :绑定一个数据到选择集上
  • data() :绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定

假设现在有如下三个段落元素。

<p>Apple 
     p> <p>Pear 
      p> <p>Banana 
       p> 

datum()的使用

将字符串“China”与段落元素

绑定。代码如下:

var str = "China"; var body = d3.select("body"); var p = body.selectAll("p"); p.datum(str); p.text(function(d, i){ 
    return "第 "+ i + " 个元素绑定的数据是 " + d; }); 

结果如下:

第 0 个元素绑定的数据是 China 第 1 个元素绑定的数据是 China 第 2 个元素绑定的数据是 China 

在上面的代码中,用到了一个无名函数 function(d, i)。当选择集需要使用被绑定的数据时,常需要这么使用。其包含两个参数,其中:

  • d 代表数据,也就是与某元素绑定的数据。
  • i 代表索引,代表数据的索引号,从 0 开始。

data()的使用

var dataset = ["I like dog","I like cat","I like snake"]; 

上述为一个数组,现在分别将数组中的三串字符与Apple、pear、banana绑定并替换,代码如下:

var body = d3.select("body"); var p = body.selectAll("p"); p.data(dataset) .text(function(d, i){ 
    return d; }); 

3. 使用d3在SVG画布中绘图

SVG 有如下特点:

  • SVG 绘制的是矢量图,因此对图像进行放大不会失真。
  • 基于 XML,可以为每个元素添加 JavaScript 事件处理器。
  • 每个图形均视为对象,更改对象的属性,图形也会改变。
  • 不适合游戏应用。

Canvas是通过 JavaScript 来绘制 2D 图形,是 HTML 5 中新增的元素。 有如下特点:

  • 绘制的是位图,图像放大后会失真。
  • 不支持事件处理器。
  • 能够以 .png 或 .jpg 格式保存图像
  • 适合游戏应用
var width = 300; //画布的宽度 var height = 300; //画布的高度 var svg = d3.select("body") //选择文档中的body元素 .append("svg") //添加一个svg元素 .attr("width", width) //设定宽度 .attr("height", height); //设定高度 

4. 比例尺的使用

比例尺的存在是为了调整比例差距悬殊的数据在同一个画布的显示。

我们需要一种关系,能够将某一区域的值映射到另一区域,其大小关系不变。

4.1 线性比例尺

// 有以下数组: var dateset = [1.2, 2.3, 0.9, 1.5, 3.3]; //要求将dataset中最小的值映射成0;最大的映射成300 var min = d3.min(dataset); //使用d3计算最小值 var max = d3.max(dataset); var linear = d3.scale.linear() .domain([min, max]) .range([0, 300]); linear(0.9); //返回0 linear(2.3); //返回175 linear(3.3); //返回300 

其中,d3.scale.linear()返回一个线性比例尺domain()range() 分别设定比例尺的定义域和值域。

4.2 序数比例尺

有时候定义域与值域不一定连续。

//有如下两个数组: var index = [0, 1, 2, 3, 4]; var color = ["red", "blue", "green", "yellow", "black"]; //希望将数字与颜色对应起来,但这些值都是离散的,线性比例尺不适合,需要用到序列比例尺 var ordinal = d3.scale.ordinal() .domain(index) .range(color); ordinal(0); //返回 red ordinal(2); //返回 green ordinal(4); //返回 black 

4.3 给柱形图添加比例尺

var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ]; //使用线性比例尺映射 var linear = d3.scale.linear() .domain([0, d3.max(dataset)]) .range([0, 250]); //画一个矩形  var rectHeight = 25; //每个矩形所占的像素高度(包括空白) svg.selectAll("rect") .data(dataset) .enter() .append("rect") .attr("x",20) .attr("y",function(d,i){ 
    return i * rectHeight; }) .attr("width",function(d){ 
    return linear(d); //在这里用比例尺 }) .attr("height",rectHeight-2) .attr("fill","steelblue"); 

5. 坐标轴

D3 提供了一个组件:d3.svg.axis(),帮助我们完成SVG中复杂的坐标轴绘制。

//定义坐标轴 var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ]; //数据 var linear = d3.scale.linear() //定义比例尺 .domain([0, d3.max(dataset)]) .range([0, 250]); var axis = d3.svg.axis() //坐标轴组件,在svg中生成组成坐标轴的元素 .scale(linear) //指定线性比例尺 .orient("bottom") //指定刻度的方向,bottom表示刻度在坐标轴的下方显示 .ticks(7); //指定刻度的数量 

定义好坐标轴之后,需要在SVG中添加一个分组元素,再将坐标轴的其他元素添加到其中:

svg.append("g") .call(axis); 

6. 理解update、enter、exit

Update、Enter、Exit 是 D3 中三个非常重要的概念,它处理的是当选择集和数据的数量关系不确定的情况。

元素绑定,那么就会有两个数据没有元素与之对应,这时候D3会建立两个空的元素与数据对应,这一部分就称为
Enter。而有元素与之对应的部分称为
update

假设, dateset = [1],这会出现两个元素没有数据与其绑定,啧没有数据绑定的部分称为 exit

总结:
元素数量 = 数组长度——update
元素数量< 数组长度——enter
元素数量 > 数据长度——exit






var dataset = [ 3 , 6 , 9 , 12 , 15 ]; //选择body中的p元素 var p = d3.select("body").selectAll("p"); //获取update部分 var update = p.data(dataset); //获取enter部分 var enter = update.enter(); //update部分的处理:更新属性值 update.text(function(d){ 
       return "update " + d; }); //enter部分的处理:添加元素后赋予属性值 enter.append("p") .text(function(d){ 
       return "enter " + d; }); 
var dataset = [ 3 ]; //选择body中的p元素 var p = d3.select("body").selectAll("p"); //获取update部分 var update = p.data(dataset); //获取exit部分 var exit = update.exit(); //update部分的处理:更新属性值 update.text(function(d){ 
       return "update " + d; }); //exit部分的处理:修改p元素的属性 exit.text(function(d){ 
       return "exit"; }); //exit部分的处理办法:通常是删除元素 // exit.remove(); 

7. 交互操作

在 D3 中,每一个选择集都有 on() 函数,用于添加事件监听器。

var circle = svg.append("circle"); circle.on("click", function(){ 
       //在这里添加交互内容 }); 

鼠标常用的事件有:

click:鼠标单击某元素时,相当于 mousedown 和 mouseup 组合在一起。

  • mouseover:光标放在某元素上。
  • mouseout:光标从某元素上移出来时。
  • mousemove:鼠标被移动的时候。
  • mousedown:鼠标按钮被按下。
  • mouseup:鼠标按钮被松开。
  • dblclick:鼠标双击。

键盘常用的事件有三个:

  • keydown:当用户按下任意键时触发,按住不放会重复触发此事件。该事件不会区分字母的大小写,例如“A”和“a”被视为一致。
  • keypress:当用户按下字符键(大小写字母、数字、加号、等号、回车等)时触发,按住不放会重复触发此事件。该事件区分字母的大小写。
  • keyup:当用户释放键时触发,不区分字母的大小写。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205882.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午4:58
下一篇 2026年3月19日 下午4:58


相关推荐

  • catalan数

    catalan数原理令 h 0 1 h 1 1 catalan 数满足递推式 h n h 0 h n 1 h 1 h n 2 h n 1 h 0 n 2 例如 h 2 h 0 h 1 h 1 h 0 1 1 1 1 2h 3 h 0 h 2 h 1 h 1 h 2 h 0 1 2 1 1 2 1 5 另类递推式

    2026年3月19日
    1
  • rsync备份大量数据_SnapShot能做增量备份吗

    rsync备份大量数据_SnapShot能做增量备份吗文章目录一、rsync简介二、实验过程三、rsync命令四、编译安装包下载一、rsync简介  sync是一个常用的Linux应用程序,用于文件同步。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。  它名称里面的r指的是remote,rsync其实就是“远程同步”(remotesync)的意思。与其他文件传输工具(如FTP或scp)不同,rsync的最大特点是

    2022年10月13日
    4
  • 2015年最新Android基础入门教程目录(完结版)

    2015年最新Android基础入门教程目录(完结版)2015年最新Android基础入门教程目录(完结版)前言:关于《2015年最新Android基础入门教程目录》终于在今天落下了帷幕,全套教程共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享以及一些疑问等可戳:下面是本系列教程的完整目录:

    2022年5月2日
    37
  • 我的世界手机版虚拟人生服务器,我的世界大型虚拟人生整合包

    我的世界手机版虚拟人生服务器,我的世界大型虚拟人生整合包我的世界大型虚拟人生整合包将为大家带来超多丰富的模组 展开一场刺激的冒险之旅 增加了很多场景地图 玩起来更加丰富有趣 喜欢虚拟人生的玩家千万不要错过 快来一起下载吧 我的世界大型虚拟人生整合包介绍玩过 MC 虚拟人生 mod 的玩家 觉得还不过瘾的话 为你们带来这个最新的 我的世界大型虚拟人生整合包 为了带来一个新鲜 刺激 有趣的体验 游戏中加入大量的冒险元素 玩家可以经历农村生活 地牢探险 科技发展等

    2026年3月17日
    1
  • 原来一直以为i686是64位的

    原来一直以为i686是64位的在yum上找32位的i386找不到,看到i686以为是64位呢,原来它也是32位啊i686只是i386的一个子集,支持的cpu从Pentium2(686)开始,之前的型号不支持.备注:1.i386适用于intel和AMD所有32位的cpu.以及via采用X86架构的32的cpu.intel平台包括8086,80286,80386,80486,奔腾系列(1.2.3.4…

    2022年5月8日
    149
  • android 自定义控件 MeasureSpec.getMode

    android 自定义控件 MeasureSpec.getModeMeasureSpec 对象包含一个 size 和一个 mode 其中 mode 可以取以下三个数值之一 UNSPECIFIED 0x 未加规定的 表示没有给子 view 添加任何规定 EXACTLY 0 0x0 精确的 表示父 view 为子 view 确定精确的尺寸 fill parentAT MOST 0x

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号