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 秒