本文整理 d3.js 中常被忽略但极具实用价值的内置函数。重点解析 selection.classed 的类名切换、transition.filter 的过渡过滤、d3.interpolate 的类型自适应插值,以及 d3.ascending、d3.min/max/extent 等数组处理工具,同时涵盖 brush、时间计数与常见布局算法,旨在提升可视化开发效率。
前言
在 d3.js 的 API 文档中,提供了许多内置函数,但其中一些非常有用的函数却常被忽视。本文旨在整理这些被遗忘却实用的函数,希望整理后它们不再被忽略。
selection.classed 与 transition.filter
selection.classed(name,【value】)
value 参数为可选。若未指定,该函数返回与 name 参数匹配的第一个非空元素是否绑定了指定的 CSS 类:true 表示已绑定,false 表示未绑定。若指定了 value 参数,则用于为 selection 添加或删除 CSS 类。
此特性与selection.attr(name,【value】)高度相似,但相对冷门。或许鲜有人不知selection.attr(name,【value】),却有许多人并不了解selection.classed(name,【value】) 。
该函数非常实用。例如,当鼠标进入某些点时,利用它让这些点高亮以表示强调;鼠标移出后,使其恢复原来的样式。这免去了重新设置样式的麻烦,甚至在恢复原样式时往往还需要进行判断,使用此函数能简化这一过程。
transition.filter(selector)
过渡效果也可以进行过滤,这一点可能很多人都忽略了。例如,可以设置动画结束时索引为奇数的元素旋转 30 度。甚至可以自定义规则,如仅第 5、10、15 个元素发生改变,而其他元素保持不变。
d3.interpolate 插值器类型
d3.interpolate(a,b)
该函数返回一个介于 a 和 b 之间的默认插值器,插值器的类型取决于 b 的类型。
1)如果 b 是颜色类型,则返回 interpolateRgb 插值器。
2)如果是字符串类型,则返回 interpolateString 插值器。
3)如果是数组类型,则返回 interpolateArray 插值器。
4)如果是对象类型,且不能强制转换成字符串类型,则返回 interpolateObject 插值器。
5)否则,返回 interpolateNumber 插值器。
d3 数组相关 API
数组相关 API
使用 d3 时,会有大量的数组操作。如果能合理运用 d3 提供的数组相关函数,将大大提高工作效率。
d3.ascending(a,b)
如果 a 大于 b,返回 1;如果 a 等于 b,返回 0。
在可视化元素需要有序排列时,这个函数很有用,可以帮助我们完成排序。
d3.min(),d3.max(),d3.extent()
前两个函数知道的人应该不少,但最后一个相对冷门。它可以直接返回数组自然排序的最小值和最大值,省去了同时调用前面两个函数的步骤。
d3.sum(),d3.mean(),d3.median(),d3.quantile()
基本的求和、平均数、中位数、p 分位数,d3 都已实现。之前可能还需要自己编写代码,虽然不难,但代码会显得冗长难看。
d3.shuffle(array)
使用 Fisher-Yates shuffle 算法将传入的数组进行随机排序。这样在需要得到乱序结果时,实现起来是否更加高效?
d3.keys(object),d3.values(object)
keys 返回一个包含指定对象(关联数组)中所有属性名称的数组。这点很有用,例如在使用 d3.csv() 读文件时,想要滤掉一些无关的 dimension(如 id 等),使用这个函数就非常方便。
d3.map(),d3.set()
映射与集合是很常见的数据结构,但不是所有 js 版本中都有默认的实现,但 d3 提供了支持。在项目开发中遇到此类问题时,可以借用 d3 提供的 map 与 set 来解决。
d3.merge(arrays)
将指定参数 arrays 合并为一个数组。与内置的 concat 类似,不过在处理二维数组时,它会更方便。
d3.zip(arrays),d3.pairs(arrays)
d3.zip(【1,2】,【3,4,5】) 返回【【1,3】,【2,4】】。具体用途需在实际应用中体会。
d3.pairs(【1,2,3,4】) 返回【【1,2】,【2,3】,【3,4】】。
d3.transpose(matrix)
用于转置二维矩阵。
brush、时间计数与布局函数
brush
作为一个可视化系统,怎能缺少 brush!实现 brush 的功能非常简单,构造刷子之前,需要指定 x/y 比例尺和空的范围。绘制的刷子可以重新调整大小和位置。
时间的计数
d3.time.dayOfYear(date) 返回参数 date 是一年里的第几天,1 月 1 日是第 0 天。
weekOfYear 等函数也是存在的,需要用的时候可以查阅 API,省去了编写闰年判断的麻烦。
布局
Stack(layers【,index】) 让我记忆最深,之前做一个项目时,不知道有这东西存在,愣是自己实现了一遍。不仅麻烦,而且结果是否正确还存疑。
地理
地理的 API 这块我很陌生,没有什么机会做这方面的项目,所以用的很少,后面有机会再来补充。
几何
同样陌生的还有几何这部分的内容,比如四叉树、凸包、多边形、泰森多边形。记住这部分有这些功能即可,后面用过之后再来补充。
行为
由 zoom 和 drag 两部分组成,这是很重要却很简单的内容,希望好好掌握。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。