本着学习d3js的原则,对函数用法做出解释,对源码写出自己的理解,文章最后补充一些源码中用到的JS语法,欢迎各位批评指正,学习交流!多多评论共同进步!

d3.min(iterable[,accessor])

根据顺序返回可迭代对象中的最小值,如果没有可以比较的值,返回undefined. 可选访问函数等价于调用Array.from(Array.from用法,将类似于数组的对象转化为数组,要求该对象有length属性)。

和Math.min不同,该方法会会忽略undefined,null,NaN值,这对处理missing data有用, 此外,元素比较顺序依赖字符串顺序而不是数字顺序,比如,["20","3"]按照字符串顺序最小值为“20”,[20,3]按照数字顺序最小值为3。

export default function min(values, valueof) {let min;if (valueof === undefined) {for (let value of values) {if (value != null&& value >= value&& (min === undefined || min > value)) {min = value;}}} else {let index = -1;for (let value of values) {if ((value = valueof(value, ++index, values)) != null&& value >= value&& (min === undefined || min > value)) {min = value;}}}return min;
}

采用ES6 module标准导出接口,这里value >= value 操作有点不解?

d3.max(iterable[, accessor])

该方法返回最大值,其他特性与d3.min类似。

export default function max(values, valueof) {let max;if (valueof === undefined) {for (let value of values) {if (value != null&& value >= value&& (max === undefined || max < value)) {max = value;}}} else {let index = -1;for (let value of values) {if ((value = valueof(value, ++index, values)) != null&& value >= value&& (max === undefined || max < value)) {max = value;}}}return max;
}

d3.extent(iterable[, accessor])

该方法返回[最小值,最大值],没有可比较元素返回[undefined,undefined]。

export default function(values, valueof) {let min;let max;if (valueof === undefined) {for (let value of values) {if (value != null && value >= value) {if (min === undefined) {min = max = value;} else {if (min > value) min = value;if (max < value) max = value;}}}} else {let index = -1;for (let value of values) {if ((value = valueof(value, ++index, values)) != null && value >= value) {if (min === undefined) {min = max = value;} else {if (min > value) min = value;if (max < value) max = value;}}}}return [min, max];
}

实现原理没有什么特别的,第一次循环将value赋值min,max,后面循环求出最大值最小值。

d3.sum(iterable[, accessor])

返回可迭代元素和,如果没有元素返回0。该方法忽略undefine,NaN。

export default function sum(values, valueof) {let sum = 0;if (valueof === undefined) {for (let value of values) {if (value = +value) {sum += value;}}} else {let index = -1;for (let value of values) {if (value = +valueof(value, ++index, values)) {sum += value;}}}return sum;
}

这里value前的+号,作用是什么?

d3.mean(iterable[, accessor])

返回平均值,忽略undefine,NaN。

export default function mean(values, valueof) {let count = 0;let sum = 0;if (valueof === undefined) {for (let value of values) {if (value != null && (value = +value) >= value) {++count, sum += value;}}} else {let index = -1;for (let value of values) {if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {++count, sum += value;}}}if (count) return sum / count;
}

d3.median(iterable[, accessor])

使用r-7method返回中位数

import quantile from "./quantile.js";
import quickselect from "./quickselect.js";function* numbers(values, valueof) {if (valueof === undefined) {for (let value of values) {if (value != null && (value = +value) >= value) {yield value;}}} else {let index = -1;for (let value of values) {if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {yield value;}}}
}export default function(values, valueof) {values = Float64Array.from(numbers(values, valueof));if (!values.length) return;const n = values.length;const i = n >> 1;quickselect(values, i - 1, 0);if ((n & 1) === 0) quickselect(values, i, i);return quantile(values, 0.5);
}

首先通过迭代器函数生成float64数组,通过quickselect给中值排好序。

d3.quickselect(arraykleft = 0, right = array.length - 1, compare = ascending)

该方法为Floyd–Rivest algorithm,快速选择算法。

详情:https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm

import ascending from "./ascending.js";// Based on https://github.com/mourner/quickselect
// ISC license, Copyright 2018 Vladimir Agafonkin.
export default function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) {while (right > left) {if (right - left > 600) {const n = right - left + 1;const m = k - left + 1;const z = Math.log(n);const s = 0.5 * Math.exp(2 * z / 3);const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));quickselect(array, k, newLeft, newRight, compare);}const t = array[k];let i = left;let j = right;swap(array, left, k);if (compare(array[right], t) > 0) swap(array, left, right);while (i < j) {swap(array, i, j), ++i, --j;while (compare(array[i], t) < 0) ++i;while (compare(array[j], t) > 0) --j;}if (compare(array[left], t) === 0) swap(array, left, j);else ++j, swap(array, j, right);if (j <= k) left = j + 1;if (k <= j) right = j - 1;}return array;
}function swap(array, i, j) {const t = array[i];array[i] = array[j];array[j] = t;
}

这个算法有点复杂,功能为快速选择k值的算法。如果数据量过大,会先选择一个样本进行就行搜索。首先对第在k的位置上的值放置到该值应该呆的位置,之后根据k位置的值所在的下标进行更新,取前部或着取后部,循环迭代直到找到了第k值。

number.js

x为null返回NaN,否则返回x,该函数的功能就是可以把字符串变成数字,+“123”=123。

export default function(x) {return x === null ? NaN : +x;
}

d3.quantile(arrayp[, accessor])


import number from "./number.js";export default function quantile(values, p, valueof = number) {if (!(n = values.length)) return;if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);if (p >= 1) return +valueof(values[n - 1], n - 1, values);var n,i = (n - 1) * p,i0 = Math.floor(i),value0 = +valueof(values[i0], i0, values),value1 = +valueof(values[i0 + 1], i0 + 1, values);return value0 + (value1 - value0) * (i - i0);
}

用法如下,当然要求传入的数组为排好序的数组

var a = [0, 10, 30];
d3.quantile(a, 0); // 0
d3.quantile(a, 0.5); // 10
d3.quantile(a, 1); // 30
d3.quantile(a, 0.25); // 5
d3.quantile(a, 0.75); // 20
d3.quantile(a, 0.1); // 2

d3.variance(iterable[, accessor])

export default function variance(values, valueof) {let count = 0;let delta;let mean = 0;let sum = 0;if (valueof === undefined) {for (let value of values) {if (value != null && (value = +value) >= value) {delta = value - mean;mean += delta / ++count;sum += delta * (value - mean);}}} else {let index = -1;for (let value of values) {if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {delta = value - mean;mean += delta / ++count;sum += delta * (value - mean);}}}if (count > 1) return sum / (count - 1);
}

使用增量算法计算方差:https://www.cnblogs.com/yoyaprogrammer/p/delta_variance.html

d3.deviation(iterable[, accessor])

import variance from "./variance.js";export default function deviation(values, valueof) {const v = variance(values, valueof);return v ? Math.sqrt(v) : v;
}

标准差即对方差开根号

d3.scan(iterable[,comparator])

对可迭代对象执行线性迭代,根据可选比较函数comparator返回最小元素的索引,(如果比较函数返回NaN,即给定的对象没有可以比较的元素,该函数返回undefined,比较函数没有指定,默认为ascending).例如:

const array = [{foo: 42}, {foo: 91}];
d3.scan(array, (a, b) => a.foo - b.foo); // 0
d3.scan(array, (a, b) => b.foo - a.foo); // 1

该方法和min非常类似,区别就是该方法接受一个比较函数而不是访问函数,返回元素为下标。

import ascending from "./ascending.js";export default function scan(values, compare = ascending) {let min;let minIndex;let index = -1;for (const value of values) {++index;if (minIndex === undefined? compare(value, value) === 0: compare(value, min) < 0) {min = value;minIndex = index;}}return minIndex;
}

d3.ascending(ab)

该比较函数为natural order,递增顺序。可以与内置的array.sort方法一起使用,以按升序排列元素。

export default function(a, b) {return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}

这里要注意array.sort在没有指定比较函数的情况下,默认排序为字典顺序(lexicographic),而不是natural。

JS语法补充:

js中的iterable

ES6标准引入iterable类型,Array、Map、Set都属于iterable类型,可以使用for...of循环来遍历。

了解更多:https://www.cnblogs.com/yuanxinru321/p/7551660.html

关于Set:https://www.cnblogs.com/diligenceday/p/5479076.html

Array.from方法:https://www.jianshu.com/p/f4554f74de95

function* 生成器函数

通过next()方法调用yield,返回两个值,value和done,分别为本次的返回值和后续是否还有yield语句布尔值。yield*可以移交执行权。

了解更多:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*

深入学习D3JS:d3-array Statistics部分 d3.min, d3.max,d3.extent,d3.sum,d3.scan,d3.ascending,d3.deviation相关推荐

  1. 深入学习D3JS:d3-color

    d3color对颜色进行操作,比如 根据名字设置颜色,steelblue var c = d3.color("steelblue"); // {r: 70, g: 130, b: ...

  2. D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js

    D3.js的v5版本入门教程(第一章) 1.需要的一些工具 这个其实随便!最简单的就是建一个.txt文件就可以敲起代码来!作者本人用的是myeclipse(主要需要安装tomcat),因为写的是前端, ...

  3. SPSS学习系列之SPSS Statistics(简称SPSS)是什么?

    不多说,直接上干货! IBM SPSS Statistics 为业务经理和分析人员提供解决基本业务和研究问题所需的核心统计过程.该软件提供的工具使用户能够快速查看数据.为其他测试拟定假设情况.执行澄清 ...

  4. Javascript学习总结三(Array对象的用法)

    javascript Array对象的常用API 1:concat concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 举例: var a1 ...

  5. Vue源码学习: 关于对Array的数据侦听

    摘要 我们都知道Vue的响应式是通过Object.defineProperty来进行数据劫持.但是那是针对Object类型可以实现, 如果是数组呢? 通过set/get方式是不行的. 但是Vue作者使 ...

  6. 学习Inventor 体会 三维设计哪个最好用 3D MAX MAYA PRO SW等

    设计工作5年了.使用过CAD 画过三维图 使用过SW 精通 3DMAX 熟练MAYA 学习Inventor后 发现更加符合工业设计这一块,效率高,如果跟SW相比 很多人说SW好用,是因为他们不知道In ...

  7. [云炬python学习笔记]Numpy中内置函数min(),max(),sum()与Python中内置函数min(),max(),sum()性能对比分析

    众所周知,Python有许多内置函数(例如min(),max(),sum()),Numpy也有自己的内置函数(np.min(),np.max(),np.sum()).由于Numpy的函数是在编译码中执 ...

  8. c语言学习-求1+2+3+…+100的和存入变量sum中,并将sum打印出来

    求1+2+3+-+100的和存入变量sum中,并将sum打印出来 程序流程图: 代码: #include<stdio.h> void main() {int a=1,sum=0; for( ...

  9. 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例

    大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...

  10. 百度 AI Studio——《高层API助你快速上手深度学习》课程学习1

    百度 AI Studio--<高层API助你快速上手深度学习>课程学习1 该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! 相关链接: 飞桨:飞桨开源框架(Pad ...

最新文章

  1. Caffe---Pycaffe进行网络结构(xxx.prototxt)可视化
  2. serverless 框架_Malaguv1.4.1支持Serverless的微服务框架
  3. 当前联机日志损坏恢复
  4. 软考 - 法律法规 标准化
  5. jmeter跨线程组传多个值_jmeter多用户登录跨线程组操作传值
  6. 资源位图android4.2中为什么要高效的处理位图资源
  7. CF567E President and Roads
  8. C语言程序设计基础实验教程,C语言程序设计基础实验教程
  9. Makefile的入门完整教程(包学包会)
  10. 某个蝰蛇音效的卡刷包代码分析
  11. 给HTML静态网页设置端口号 安装静态服务器
  12. python文本处理
  13. ftp服务器下载,细数五款好用的ftp服务器下载软件
  14. 个人网站怎么申请支付接口?
  15. Unity3d官网链接失效
  16. 浅谈编程能力的培养与提高——写给编程初学者的话
  17. 1到10的英文单词的C语言,1天10个英语专八核心词汇:C开头的单词(11)
  18. 王道计算机组成原理课代表 - 考研计算机 第四章 指令系统 究极精华总结笔记
  19. python开发工程师岗位简介_python开发工程师是什么
  20. Silvaco学习笔记(六)毕设相关

热门文章

  1. html自动排版 vs,Visual Stidio Code (vscode)自定义HTML页面自动生成格式
  2. nodeJS中express+busboy实现文件上传
  3. 微信小程序-点滴记账
  4. Sqlite3实现脏读
  5. PM Interview 60quiz
  6. 算法学习(五)—— 广度优先搜索
  7. single cell 数据分析流程及原理
  8. ps保存psd后图层全没了_Photoshop文件不显示图层
  9. SELinux audit2allow命令使用
  10. 如何检索综述类文献?