D3最佳实践:002 数据转换

D3 学习系列2

D3一般是运行在web浏览器中的,在web浏览器中,svg的所有的图形元素都必须以固定的坐标形式出现,而所有的坐标无疑都必须是数字,这就要求我们在采用d3进行数据可视化时,要提前考虑我们的哪些数据可以映射为数字,怎么映射才能把数据映射到我们规定的绘图区域内。

提到映射这个概念,我们应当立马在脑海中浮现数学中函数的这个概念,没错,函数在数学中的定义就是一种映射。在D3中预定义了很多类型的这种数据映射

定量映射

连续数值映射,相当于对数据进行缩放

  • linear 线性映射
  • log 默认以10为底的对数映射
  • pow 平方映射
  • sqrt 开方映射
  • quantile 分位数映射,根据输出域的长度,把输入域映射到相应的分位数上
  • quantize 定量映射,根据输入域和输出域,可以把输出域中的一个范围值映射到输出域的某个值上
  • threshold 阀值映射,类似于定量映射,输出域中的每个值对应了输入域的一个范围
  • identity 同一性(恒等)映射,该映射的输入和输出是一样的,是线性映射的特例

这类数值型映射的使用方式如下(以linear为例,其他类似):

var x = d3.scale.linear().domain([a,b]).range([c,d]);
//或者
var x = d3.scale.linear().domain([a,b,c,d]).range([e,f,g,h]);
//或者
var x = d3.scale.linear().domain( 一个可以返回数组格式的函数).range(一个可以返回数组可是的函数);

上面的方式,得到的是一个具有映射功能的函数。其中第一种形式,是最基本的线性映射方法,表示对输入的范围为[a,b]的数据,其输出的范围为[c,d],映射的方式可以表示为: 对于第二种映射的方式,其中输入域(domain)和输出域(range)的分段个数必须一致,D3会把输入域对应的分段映射到输出域对应的分段上,这很好的实现了分段函数的功能,其表示方式如下:

第三种映射形式表明D3可以通过接受一个函数来实现,这充分利用了JavaScript的闭包特性,也为我们可以简洁的使用提供了方便的方法。

在使用这种转换时,我们的最佳实践是:

var x = d3.scale.linear().range([0,width]);
...
...
d3.json("url",function(error,data){
	if(error){
		throw error;
	}
	
	x.domain(d3.extent(data.map(function(d){ return ...})));
	
});

在使用D3时,我们绘图区域的范围一般是已知的,未知的是我们的数据范围,上面的例子就很好的演示了在使用D3时,我们可以先确定输出域(range),然后获取数据后,根据数据计算出输入域。

其他的映射,如log映射,其转换方式如下:

linear,log,pow,sqrt 映射基本的使用技巧都是一致的

quantile需要举个例子介绍:

var q = d3.scale.quantile();
q.domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]);
q.range([0,1,2,3,4])
q(x)

定序映射

在很多数据分析中,很多数据存在分类变量(也可以叫做水平因子),这类的数据在绘图坐标转换时,经常需要把这些分类变量映射到一个绘图区域中D3中有专门的针对这种类型数据的映射:

  • ordinal 有序映射

举个简单的例子,样本的一个维度,可以取四个值,按照这个维度绘制频数的柱状图,这时需要在绘图区域对这个维度的四个值进行映射:

var 0 = d3.scale.ordinal();
o.domain([1,2,3,4]);
o.rangeBands([0,width],10,20)

时间映射

我们有很多和时间相关的数据,比如股市的,每天的股市数据,时间数据的分析,有一个专门的学科分支–时间序列。在D3中,也有简单的时间数据映射方式:

var x = d3.time.scale().range().domain();

其中,我们传入range方法的一般都是我们的绘图区域的数组,而传入domain方法的是JavaScript的Date类型的对象数组。而我们在页面上获取的数据一般都是文本形式的,这时我们就可以使用D3提供的时间解析函数了,其使用的方式极为简单:

var parse = d3.time.format().parse;

其中format函数需要提供一个日期的格式化字符串,该字符串一个可能的形式是:

"%Y %m %d" 表示“2015 07 31“这样一个日期时间。

该字符串中的格式化字符为:

  • %Y 年的四位数
  • %y 年的两位数表示
  • %M 分钟数
  • %m 月份数
  • %b 月份英文简称
  • %B 月份全称
  • %d 月份中的第几天
  • %H 24小时制
  • %h 12小时制
  • %S 秒
Jeff Lee /
Published under (CC) BY-NC-SA in categories 可视化  tagged with 转换  D3