数据可视化的本质就是将数据映射到图形,不一样数据类型的数据适合的图形属性也不同,本章讲解数据分类和G2是如何设计数据分类。图形属性在下一章节视觉通道中讲解。算法
数据的类型能够按照两种分类方式:
* 数据天然的分类
* 数据是否连续数组
按照数据的天然分类,能够将数值类型分为:
* 名词:常见的名词,不关心顺序,好比国家的名称
* 有序:有序的分类,例如警报信息,从低到高分为黄色警告、橙色警告和红色警告
* 间隔:有间隔的数字,不考虑0的意义。例如温度,0度不表明没有温度
* 比例:表示字段之间存在比例关系,0必须有意义。dom
按照数据是否连续划分的方式:
+ 分类(定性)数据,又分为有序的分类和无序的分类
+ 连续(定量)数据,连续不间断的数值,时间也是一种连续的数据类型ide
首先咱们来看一下下面的数据:函数
[
{"month":"一月","temperature":7,"city":"tokyo"}, {"month":"二月","temperature":6.9,"city":"newYork"}, {"month":"三月","temperature":9.5,"city":"tokyo"}, {"month":"四月","temperature":14.5,"city":"tokyo"}, {"month":"五月","temperature":18.2,"city":"berlin"} ]
其中:month 表明月份,temperature 表明温度,city 表明城市网站
month
和city
都是离散的分类,可是又有所差别。month
是有序的分类类型,而city
是无序的分类类型。咱们在G2中将数据类型按照是否连续来划分,每种分类设计成不一样的度量(Scale),度量用于完成如下功能:spa
分类a
转换成 0.2,那此时 0.2反转回来的值就是分类a
将数据划分,用于在坐标轴上、图例上显示数值的范围、分类等信息设计
因此每种度量必须包含如下信息:code
G2中提供了下面几种度量orm
度量共有的属性:
属性名 | 说明 |
---|---|
type | 度量类型 |
range | 度量转换的值域,默认是[0,1] |
alias | 别名,大多数数据集合的字段名都是英文,有时候须要定义中文名称,便于在图例、提示信息上显示 |
ticks | 支持的坐标点,能够在图例、坐标轴上显示,坐标点的计算后面详细介绍 |
tickCount | 坐标点的个数,不一样类型的度量默认值不一样 |
formatter | 输出字段时的格式化函数,会影响数据在坐标轴、图例、提示信息(tooltip)上的显示 |
连续的数据类型的基类,包含如下特殊的属性
属性名 | 说明 |
---|---|
min | 定义域的最小值 |
max | 定义域的最大值 |
tickCount | 连续类型的度量,默认生成坐标点的个数是5 |
tickInterval | 用于指定坐标轴各个标度点的间距,是原始数据之间的间距差值,tickCount 和 tickInterval 不能够同时声明 |
nice | 是否根据人对数字识别的友好度,来调整min和max。例如 min:3,max: 97,若是nice: true,那么会自动调整为:min: 0,max: 100 |
分类类型度量的特殊属性
属性名 | 说明 |
---|---|
values | 当前字段的分类值 |
G2建立图表的时候,values字段通常会自动从数据中取得,可是如下2中情形下须要用户手动指定
须要指定分类的顺序时,例如:type 字段有’最大’,’最小’和’适中’3种类型,咱们想指定这些分类在坐标轴或者图例上的顺序时:
[
{a: 'a1', b:'b1', type: '最小'}, {a: 'a2', b:'b2', type: '最大'}, {a: 'a3', b:'b3', type: '适中'} ] var defs = { 'type': {type: 'cat',values: ['最小','适中','最大']} };
若是不声明度量的values字段,那么默认的顺序是:‘最小’,‘最大’,‘适中’
若是数据中的分类类型使用枚举的方式表示,那也也须要指定values
[
{a: 'a1', b:'b1', type: 0}, {a: 'a2', b:'b2', type: 2}, {a: 'a3', b:'b3', type: 1} ] var defs = { 'type': {type: 'cat',values: ['最小','适中','最大']} };
必须指定’cat’类型,values的值按照索引跟枚举类型一一对应
time类型是一种特殊的连续型数值,因此咱们将time类型的度量定义为linear的子类,除了支持全部通用的属性和linear度量的属性外,还有本身特殊的属性:
属性名 | 说明 |
---|---|
mask | 数据的格式化格式 默认:’yyyy-mm-dd’ |
目前支持 2 种类型的时间(time)类型:
格式化日期时mask的占位符:
log类型的数据能够将很是大范围的数据映射到一个均匀的范围内,这种度量是linear的子类,支持全部通用的属性和linear度量的属性,特有的属性:
属性名 | 说明 |
---|---|
base | Log 的基数,默认是2 |
如下情形下建议使用log度量
pow类型的数据也是linear类型的一个子类,除了支持全部通用的属性和linear度量的属性外也有本身的属性:
属性名 | 说明 |
---|---|
exponent | 指数,默认是2 |
timeCat类型的数据,是一种日期数据,可是不是连续的日期。例如表明存在股票交易的日期,此时若是使用time类型,那么节假日没有数据,折线图、k线图会断裂,因此此时使用timeCat的度量表示分类的日期,默认会对数据作排序。
属性名 | 说明 |
---|---|
tickCount | 此时须要设置坐标点的个数 |
mask | 数据的格式化格式 |
度量的信息须要在图例、坐标轴上显示时,不可能所有显示全部的数据,那么就须要选取一些表明性的数据显示在图例、坐标轴上,咱们称这些数据为ticks
(坐标点),不一样的类型的度量计算ticks(坐标点)的算法各不同,咱们这里提供3类度量ticks(坐标点)的计算:
分类度量通常状况下不须要计算ticks,直接将全部的分类在图例、坐标轴上显示出来便可
可是当分类类型的数值过多,同时分类间有顺序关系时能够省略掉一些分类例如:
计算时须要使用到的属性:
分类的ticks计算很是简单个
整除的场景:
var values= ["第一周","第二周","第三周","第四周","第五周","第六周","第七周","第八周","第九周"]; var tickCount = 5; // 因为 values.length = 9; // 平均间隔 step = (9 - 1) / (5 - 1) = 2; var ticks = ["第一周","第三周","第五周","第七周","第九周"]
不能整除:
var values= ["第一周","第二周","第三周","第四周","第五周"]; var tickCount = 4; // 因为 values.length = 5; // 平均间隔 step = (5 - 1) / (4 - 1) = 4/3; 取整 step = 1; // 舍弃了第四周 var ticks = ["第一周","第二周","第三周","第五周"]
连续数据类型计算坐标点须要考虑如下问题:
连续数据坐标点的计算方式以下:
伪代码以下:
var snapArray = [0, 2, 5,10]; var min = 0; var max = 9003; var tickCount = 4; var tickInterval = (max - min) / (tickCount - 1); // 3001; var factor = getFactor(tickInterval)// 1000,若是value > 10 则不断除以10 直到除数 1<value<10,若是value < 1,则不断乘以10, 直到 1< value < 10 var snapValue = snap(snapArray, tickInterval / factor, 'ceil'); // 向上逼近,逼近值5 var tickInterval = snapValue * factor; var min = snapMultiple(tickInterval, min, 'floor')// 向下取tickInterval的整数倍,0 var max = snapMultiple(tickInterval,max, 'ceil') //向上取tickInterval的整数倍,15000 var ticks = []; for(var i = min; i <= max; i+= tickInterval){ ticks.push(i); } return ticks;
注意事项
* snapArray 能够进行调整,数组内部值越多,间距越小,计算出来的tickCount跟预期的差距越小
* min,必须向下取tickInterval的倍数,max ,必须向上取tickInterval的倍数
时间类型的数据是连续数据,可是不适合连续数据度量的计算方式缘由在于:
因此时间类型的度量须要本身的算法,算法以下:
注意事项:
本章讲解了数据分类和G2如何设计数据分类,而且提供了计算坐标点(ticks)的方法,图例和坐标轴显示的文本所有由本章讲解的度量所决定,下一章节讲解视觉通道,并讲解视觉通道跟数据分类的关系。