數據可視化的本質就是將數據映射到圖形,不一樣數據類型的數據適合的圖形屬性也不同,本章講解數據分類和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)的方法,圖例和座標軸顯示的文本所有由本章講解的度量所決定,下一章節講解視覺通道,並講解視覺通道跟數據分類的關係。