D3.js的基础部分之数组的处理数组的排序和求值(v3版本)


Posted in Javascript onMay 09, 2019

数组的处理 :

数组时一种常用的数据结构,通常是由相同数据类型的项组成集合,拥有数组名,可以凭借数组名和下标来访问数组项。虽然JavaScript允许一个数组中存在不同的数据类型,但实际很少这样使用。需要被可视化的数据常以数组的形式存在,虽然JavaScript中提供了不少操作数组的方法,但JavaScript不是为了数据可视化而存在的。因此,D3数据可视化的需求封装了不少数组处理函数。

一 排序 :

排序的方法:

d3.ascending(a,b);
//递增函数。如果a小于b,则返回-1;如果a大于b,返回1;如果a等于b,返回0;

d3.descending(a,b);
 //递减函数。如果a大于b,则返回-1;如果a小于b,返回1;如果a等于b,返回0; 

之前给大家说过对选择集使用sort()方法。但是如果不指定比较函数的情况下,默认是d3.ascending。 这是D3提供的一个递增函数。其实D3给我们提供了递增和递减两个比较函数。比较函数的规则是 :有函数function(a,b),

如果要使a位于b之前,则返回值小于0;

如果要使a位于b之后,则返回值大于0;

如果a与b相等,则返回值为0; 

d3.ascending(a,b);

//递增函数。如果a小于b,则返回-1;如果a大于b,返回1;如果a等于b,返回0;举个例子 :

var numList = [22,44,33,11,66];
 numList.sort(d3.ascending); //注意 : 此处的sort()方法使JavaScript的数组方法对象(Array)的方法,不是D3的selection.sort()方法。
console.log(numList) //[11,22,33,44,66]

 d3.descending(a,b);
//递减函数。如果a大于b,则返回-1;如果a小于b,返回1;如果a等于b,返回0;再举个例子 :

var numList = [22,44,33,11,66];
 numList.sort(d3.descending); //注意 : 此处的sort()方法使JavaScript的数组方法对象(Array)的方法,不是D3的selection.sort()方法。
console.log(numList) //[66,44,33,22,11]

二 求值 :

求值的方法:

d3.min(array[,accessor])

    
//返回数组的最小值
d3.max(array[,accessor])

   
//返回数组的最大值
d3.extent(array[,accessor])

 
//返回数组最小值和最大值

d3.sum(array[,accessor])

   
//返回数组的总和,如果数据为空,则返回0。
d3.mean(array[,accessor])

        
//返回数组的平均值,如果数组为空,则返回undefined

d3.median(array[,accessor])

     
//求数组的中间值,如果数组为空,则返回undefined。
d3.quantile(numbers,p)

     
//求取p分位点的值,p的范围为[0,1]。数组需先递增排序。 

d3.variance(array[,accessor])

   
//求方差
 d3.deviation(array,[,accessor])   

   
//求标准差 

d3.bisectLeft()

    
//获取某数组项左边的位置
 d3.bisect()

  
 //获取某数组项右边的位置

求取数组的最大值、最小值、中间值、平均值等。在D3中,这一类函数形如 :
d3.function(array,[,accessor]);
其中,第一个参数array是数组,第二个参数是accessor是可选参数。accessor是一个函数,指定之后,数组各项首先会调用accessor,然后再使用原函数function进行处理。

d3.min(array[,accessor])
//返回数组的最小值
 d3.max(array[,accessor])
//返回数组的最大值
 d3.extent(array[,accessor])
 //返回数组最小值和最大值

以上三个函数的参数有两个:必选参数array和可选参数accessor。其中,array中的undefined会自动被忽略。举个例子: 

//定义数组
  var numbers = [30,20,50,10,80,60]

  //求最小值和最大值
  var min = d3.min(numbers)
  var max = d3.max(numbers)
  var extent = d3.extent(numbers)

  //输出结果
  console.log(min) //10
  console.log(max) //80
  console.log(extent) //[10,80]

  //使用accessor,在求值之前先出来了数据
  var minAcc = d3.min(numbers,function(d){return d*3})
  var maxAcc = d3.max(numbers,function(d){return d-1})
  var extentAcc = d3.extent(numbers,function(d){return d%7})

  //输出结果
  console.log(minAcc)  //30
  console.log(maxAcc)  //79
  console.log(extentAcc) //[1,6]

上面代码中,先是在不指定accessor的情况下,调用了最大值和最小值的三个函数。然后在指定accessor的情况下,再次调用了三个函数。以d3.min为例讲解一下accessor的用法 :对于以上函数,numbers数组中的每一项都会先调用此函数,即每一项都乘以3.调用之后数组变为[90,60,150,30,240,180],然后再求此数组的最小值,结果为30。d3.extent()相当于分别调用d3.min()和d3.max(),返回值是一个数组,第一项是最小值,第二项是最大值。

d3.sum(array[,accessor])
//返回数组的总和,如果数据为空,则返回0。
d3.mean(array[,accessor])
 //返回数组的平均值,如果数组为空,则返回undefined 

以上连个函数的参数同样是:必选参数array和可选参数accessor。array中无效的值undefined和NaN会被忽略。举个例子 : 

//数组定义
  var numbers = [30,20,undefined,50,10,80,60,NaN]
  //求总和与平均值
  var sum = d3.sum(numbers,function(d){return d-10})
  var mean = d3.mean(numbers)
  //输出结果
  console.log(sum) //190
  console.log(mean) //41.666666666666664

上面代码中,数组内有undefined和NaN,但是对于函数的使用是不受影响的。
var mean = d3.mean(numbers) //数组中的数据总和除以6,而并非数组的length。而是除以去掉无效数值之后的有效长度。

d3.median(array[,accessor])
//求数组的中间值,如果数组为空,则返回undefined。
 d3.quantile(numbers,p)
//求取p分位点的值,p的范围为[0,1]。数组需先递增排序。 

d3.median()参数为 : 数组array和可选参数accessor。与d3.sum()和d3.mean()一样,会忽略掉undefined和NaN。如果数组的有效长度为奇数,则中间值为数据经过递增排序之后位于正中间的值;如果有效长度为偶数,则中间值为经过递增排序后位于正中间的两个数的平均值。d3.median()其实是使用d3.quantile()实现的。d3.quantile()接受两个参数:第一个是经过递增排序后的数组;第二个是分位点,范围是[0,1]。先看一下d3.quantile()是如何使用的 :

//数组定义
  var numbers = [2,8,15]
  numbers.sort(d3.ascending);
  console.log(d3.quantile(numbers,0))   //返回2
  console.log(d3.quantile(numbers,0.25))  //返回5
  console.log(d3.quantile(numbers,0.5))  //返回8
  console.log(d3.quantile(numbers,0.75))  //返回11.5
  console.log(d3.quantile(numbers,0.9))  //返回13.599999999999998
  console.log(d3.quantile(numbers,1.0))  //返回15

这段代码的数组中,2位于0分位处,8位于0.5分位处,15位于1分位处。d3.median()其实相当于是将数组中的无效值(undefined和NaN)去掉之后,再使用d3.quantile()获取0.5分位处的值。

接下来看一下使用d3.median()的例子:

//定义数组
     var numbers1 = [3,5,9,undefined,11,NaN];
     console.log(d3.median(numbers1))  //返回7
     var numbers2 =[3,5,9,undefined,11,NaN,17];
     console.log(d3.median(numbers2))  //返回9

d3.variance(array[,accessor])
 //求方差
d3.deviation(array,[,accessor])
 //求标准差

方差和标准方差用于度量随机变量和均值之间的偏离程度,在概率统计中经常用到。其中标准差是方差的二次方根。这两个值越大,表示此随机变量均值的程度越大。这两个函数的参数为必选参数array和可选参数accessor,并且都会忽略数组array中的undefined和NaN。请看代码 :

//定义数组
    var numbers1 = [1,9,7,9,5,8,9,10]
    console.log(d3.mean(numbers1))     //返回平均值7.25
    console.log(d3.variance(numbers1))   //返回方差值 约8.79
    console.log(d3.deviation(numbers1))   //返回标准差值 约2.96

    var numbers2 = [7,8,6,7,7,8,8,7];
    console.log(d3.mean(numbers2))     //返回平均值7.25
    console.log(d3.variance(numbers2))   //返回方差值 约0.5
    console.log(d3.deviation(numbers2))   //返回标准差值 约0.71

这段代码中,数组numbers1和numbers2的平均值都是7.25,但是前者的方差和标准差分别为8.79和2.96,后者的方差和标准差分别为0.50和0.71,表明数组numbers1中的值偏离平均值7.25的程度较大。

d3.bisectLeft()
 //获取某数组项左边的位置
d3.bisect()
//获取某数组项右边的位置
d3.bisectRight()
//和d3.bisect() ,获取某数组项右边的位置

有时候需要对数组中指定的位置插入项,因此需要获取指定的位置。在JavaScript中,要向某数组插入项,可使用splice(),而bisectLeft()、bisect()和bisectRight()可配合splice()使用。首先来看一下,splice()是怎样插入数组项的:

//定义数组
    var dataList = ["China","America","Japan","France"]
    //在数组索引为1的位置处,删除0个项后,插入字符串Germany
    dataList.splice(1,0,"Germany");
    //再来打印一下新数组
    console.log(dataList)  //输出 ["China", "Germany", "America", "Japan", "France"]
    //在数组索引为3的位置处,删除一个项后,插入两个字符串Britain和Russis
    dataList.splice(3,1,"Britain","Russis")
    //再来打一下新数组
    console.log(dataList)  //输出["China", "Germany", "America", "Britain", "Russis", "France"]

splice()可用于删除数组项,也可以用于插入数组项。

接下来看看d3.bisectLeft()的使用方法 :

//定义数组
    var numbers = [10,13,16,19,22,25]

    //获取16左边在数组中的位置
    var iLeft = d3.bisectLeft(numbers.sort(d3.ascending),16);
    console.log(iLeft) //2

    // 在iLeft位置处,删除0项,出入66
    numbers.splice(iLeft,0,66)
    //打印新数组
    console.log(numbers)  [10, 13, 66, 16, 19, 22, 25]

这段代码中,将numbers排序后,在使用bisectLeft()获取了16左边的位置。bisectLeft()所使用的数组必须经过=递增排序。第二个参数用于指定某项的位置,如果此项在数组中存在,则返回此位置的左边。如果此项在数组中不存在,则返回第一个大于此项的值得左边。举个例子 :

//定义数组
    var numbers = [10,13,16,19,22,25]
    //18在数组中不存在,返回介于16和19之间的位置
    var iLeft = d3.bisectLeft(numbers.sort(d3.ascending),18)
    console.log(iLeft) //返回值为3
    numbers.splice(iLeft,0,77);

    //打印新数组
    console.log(numbers) //输出[10, 13, 16, 77, 19, 22, 25]

bisect()和bisectRight()是一样的,和bisectLeft()类似,只是获取的是指定项右边的位置。

总结

以上所述是小编给大家介绍的D3.js的基础部分之数组的处理数组的排序和求值(v3版本) ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 Javascript
从数组中随机取x条不重复数据的JS代码
Dec 24 Javascript
js 实现浏览历史记录示例
Apr 20 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
javascript 判断两个日期之差的示例代码
Sep 05 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
Apr 23 Javascript
js内置对象处理_打印学生成绩单的简单实现
Sep 24 Javascript
BootStrap中
Dec 10 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
解决echarts数据二次渲染不成功的问题
Jul 20 Javascript
vue 全局封装loading加载教程(全局监听)
Nov 05 Javascript
JS原型与继承操作示例
May 09 #Javascript
详解微信小程序回到顶部的两种方式
May 09 #Javascript
jquery登录的异步验证操作示例
May 09 #jQuery
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 #Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 #Javascript
vue 引用自定义ttf、otf、在线字体的方法
May 09 #Javascript
bootstrap-table formatter 使用vue组件的方法
May 09 #Javascript
You might like
一个数据采集类
2007/02/14 PHP
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
ThinkPHP模型详解
2015/07/27 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
详解vue axios用post提交的数据格式
2018/08/07 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
如何基于python操作json文件获取内容
2019/12/24 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
python集合能干吗
2020/07/19 Python
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
住宅质量保证书
2014/04/29 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
Python标准库pathlib操作目录和文件
2021/11/20 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript