关于 ECharts4 新增的数据集(dataset)
ECharts 4 開始有了 `數據集`(`dataset`)組件來單獨聲明數據,大概長這個樣子:
這個最簡單的例子,得到的效果是這樣的:
數據集帶來的好處是:
- 有了 `dataset` 后,能夠貼近這樣的數據可視化常見思維方式:基于數據(`dataset` 組件來提供數據),指定數據到視覺的映射(由 `encode` 屬性來指定映射),形成圖表。
- 數據和其他配置可以被分離開來,使用者相對便于進行單獨管理,也省去了一些數據處理的步驟。
- 數據可以被多個系列或者組件復用,對于大數據,不必為每個系列創建一份。
- 支持更多的數據的常用格式,例如二維數組、對象數組等,一定程度上避免使用者為了數據格式而進行轉換。
數據到圖形的映射
本篇里,我們制作數據可視化圖表的邏輯是這樣的:基于數據,在配置項中指定如何映射到圖形。
概略而言,可以進行這些映射:
- 指定 dataset 的列(column)還是行(row)映射為圖形系列(series)。這件事可以使用 `series.seriesLayoutBy` 屬性來配置。
- 指定 dataset 的哪些列(column)或行(row)對應到坐標軸(如 X、Y 軸)、提示框(tooltip)、標簽(label)、圖形元素大小顏色等(visualMap)。這件事可以使用 `series.encode` 屬性來配置。如果有需要映射顏色大小等視覺維度,可以使用 visualMap 組件。
按行還是按列做映射
有了數據表之后,使用者可以靈活得配置:數據如何對應到軸和圖形系列。上面的例子中,沒有給出這種映射配置,那么ECharts 就按最常見的理解進行默認映射:
- X 坐標軸聲明為類目軸,默認情況下會自動對應到 dataset.source 中的第一列;
- 三個柱圖系列,一一對應到 dataset.source 中后面每一列。
用戶可以使用 `seriesLayoutBy` 配置項,改變圖表對于行列的理解。`seriesLayoutBy` 可取值:
- 'column': 默認值。系列被安放到 `dataset` 的列上面。
- 'row': 系列被安放到 `dataset` 的行上面。
效果是這樣的:
更重要的是,我們可以使用 `encode` 配置項來更細節得指定數據如何映射到圖形。總體是這樣的感覺:
維度(dimension)
介紹 `encode` 之前,首先要介紹“維度(dimension)”的概念。
常用圖表所描述的數據大部分是“二維表”結構,上述的例子中,我們都使用二維數組來容納二維表。現在,當我們把系列(series)對應到“列”的時候,那么每一列就稱為一個“維度(dimension)”,而每一行稱為數據項(item)。反之,如果我們把系列(series)對應到表行,那么每一行就是“維度(dimension)”,每一列就是數據項(item)。
維度可以有單獨的名字,便于在圖表中顯示。維度名(dimension name)可以在定義在 dataset 的第一行(或者第一列)。例如上面的例子中,'score'、'amount'、'product' 就是維度名。從第二行開始,才是正式的數據。`dataset.source` 中第一行(列)到底包含不包含維度名,ECharts 默認會自動探測。當然也可以設置 `dataset.sourceHeader: true` 顯示聲明第一行(列)就是維度,或者 `dataset.sourceHeader: false` 表明第一行(列)開始就直接是數據。
維度的定義,也可以使用單獨的 `dataset.dimensions` 或者 `series.dimensions` 來定義,這樣可以同時指定維度名,和維度的類型(dimension type):
var option1 = {dataset: {dimensions: [{name: 'score'},// 可以簡寫為 string,表示維度名。'amount',// 可以在 type 中指定維度類型。{name: 'product', type: 'ordinal'}],source: [...]},... };var option2 = {dataset: {source: [...]},series: {type: 'line',// 在系列中設置的 dimensions 會更優先采納。dimensions: [null, // 可以設置為 null 表示不想設置維度名'amount',{name: 'product', type: 'ordinal'}]},... }; 復制代碼大多數情況下,我們并不需要去設置維度類型,因為會自動判斷。但是如果因為數據為空之類原因導致判斷不足夠準確時,可以手動設置維度類型。
維度類型(dimension type)可以取這些值:
- 'number': 默認,表示普通數據。
- 'ordinal': 對于類目、文本這些 string 類型的數據,如果需要能在數軸上使用,須是 'ordinal' 類型。ECharts 默認會自動判斷這個類型。但是自動判斷也是不可能很完備的,所以使用者也可以手動強制指定。
- 'time': 表示時間數據。設置成 'time' 則能支持自動解析數據成時間戳(timestamp),比如該維度的數據是 '2017-05-10',會自動被解析。時間類型的支持參見 [data](option.html#series.data)。
- 'float': 如果設置成 `float`,在存儲時候會使用 `TypedArray`,對性能優化有好處。
- 'int': 如果設置成 `float`,在存儲時候會使用 `TypedArray`,對性能優化有好處。
數據到圖形的映射(encode)
了解了維度的概念后,我們就可以使用 `encode` 來做映射。`encode` 聲明的基本結構如下,其中冒號左邊是坐標系、標簽等特定名稱,如 `'x'`, `'y'`, `'tooltip'` 等,冒號右邊是數據中的維度名(string 格式)或者維度的序號(number 格式,從 0 開始計數),可以指定一個或多個維度(使用數組)。通常情況下,下面各種信息不需要所有的都寫,按需寫即可。
效果如下:
下面給出個更豐富的 `encode` 的 示例。
視覺通道(顏色、尺寸等)的映射
我們可以使用 `visualMap` 組件進行視覺通道的映射。這是一個示例:
var option = {dataset: {source: [['score', 'amount', 'product'],[89.3, 58212, 'Matcha Latte'],[57.1, 78254, 'Milk Tea'],[74.4, 41032, 'Cheese Cocoa'],[50.1, 12755, 'Cheese Brownie'],[89.7, 20145, 'Matcha Cocoa'],[68.1, 79146, 'Tea'],[19.6, 91852, 'Orange Juice'],[10.6, 101852, 'Lemon Juice'],[32.7, 20112, 'Walnut Brownie']]},grid: {containLabel: true},xAxis: {name: 'amount'},yAxis: {type: 'category'},visualMap: {orient: 'horizontal',left: 'center',min: 10,max: 100,text: ['High Score', 'Low Score'],// Map the score column to colordimension: 0,inRange: {color: ['#D7DA8B', '#E15457']}},series: [{type: 'bar',encode: {// Map the "amount" column to X axis.x: 'amount',// Map the "product" column to Y axisy: 'product'}}] }; 復制代碼幾個常見的映射設置方式
問:如何把第三列設置為 X 軸,第五列設置為 Y 軸?
答:
series: {encode: {x: 3, y: 5},... } 復制代碼問:如何把第三行設置為 X 軸,第五行設置為 Y 軸?
答:
series: {encode: {x: 3, y: 5},seriesLayoutBy: 'row',... } 復制代碼問:如何把第二列設置為標簽?
答:
關于標簽的顯示(`label.formatter`),現在支持使用這樣的語法:
'aaa{@product}bbb{@score}ccc{@[4]}ddd' 來引用某個具體的維度值。其中 '{@score}' 表示因為 “名為 score” 的維度里的值,'{@[4]}' 表示引用序號為 4 的維度里的值。
series: [{label: {show: true,// 標簽中引用第二列。formatter: 'The value at column 2 is: {@[2]}.'},... }, {label: {show: true,// 標簽中引用維度名為 product 的列。formatter: 'The product name is: {@product}.'},... }] 復制代碼問:如何讓第 2 列和第 3 列顯示在提示框(tooltip)中?
答:
series: {encode: {tooltip: [2, 3]...},... } 復制代碼問:數據里沒有維度名,那么怎么給出維度名?
答:
dataset: {dimensions: ['score', 'amount'],source: [[89.3, 3371],[92.1, 8123],[94.4, 1954],[85.4, 829]] } 復制代碼問:如何把第四列映射為氣泡圖的點的大小?
答:
var option = {dataset: {source: [[12, 323, 11.2],[23, 167, 8.3],[81, 284, 12],[91, 413, 4.1],[13, 287, 13.5]]},visualMap: {show: false,dimension: 2, // 指向第三列(列序號從 0 開始記,所以設置為 2)。min: 2, // 需要給出數值范圍,最小數值。max: 15, // 需要給出數值范圍,最大數值。inRange: {// 氣泡尺寸:5 像素到 60 像素。symbolSize: [5, 60]}},xAxis: {},yAxis: {},series: {type: 'scatter'} }; 復制代碼問:encode 里指定了映射,但是不管用?
答:可以查查有沒有拼錯,比如,維度名是:'Life Expectancy',encode 中拼成了 'Life Expectency'。
數據的各種格式
多數常見圖表中,數據適于用二維表的形式描述。廣為使用的數據表格軟件(如 MS Excel、Numbers)或者關系數據數據庫都是二維表。他們的數據可以導出成 JSON 格式,輸入到 `dataset.source` 中,在不少情況下可以免去一些數據處理的步驟。
在 JavaScript 常用的數據傳輸格式中,二維數組可以比較直觀的存儲二維表。前面的示例都是使用二維數組表示。
除了二維數組以外,dataset 也支持例如下面 key-value 方式的數據格式,這類格式也非常常見。但是這類格式中,目前并不支持 `seriesLayoutBy` 參數。
此外,ECharts 4 之前一直以來的數據聲明方式仍然被正常支持,如果系列已經聲明了 `series.data`, 那么就會使用 `series.data` 而非 `dataset`。
最后,給出一個 示例,多個圖表共享一個 `dataset`,并帶有聯動交互。
更詳細的信息,可以參見這個 教程。
總結
以上是生活随笔為你收集整理的关于 ECharts4 新增的数据集(dataset)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2784Good Luck!
- 下一篇: 中国铁塔,室内分布系统