# (02)網頁圖表的第二天:Vega-Lite Tutorial Overview ###### tags: `Vega-lite` `Note` 今天來記錄Vega-Lite中Getting Started[^Getting_Started]的部分。 ## 在Vega-Lite的格式概述: 首先,我先列出一個簡易的Vega-Lite格式,格式如下: :::success Vega-Lite圖表 ```vega { "data": { "values": [ {"a": "C", "b": 2}, {"a": "C", "b": 7}, {"a": "C", "b": 4}, {"a": "D", "b": 1}, {"a": "D", "b": 2}, {"a": "D", "b": 6}, {"a": "E", "b": 8}, {"a": "E", "b": 4}, {"a": "E", "b": 7} ], "name": null, "format": null }, "mark": "bar", "encoding": {`` "x": {"field": "a", "type": "nominal"}, "y": {"aggregate": "average", "field": "b", "type": "quantitative"} } } ``` Vega-Lite Code ```json= { "data": { "values": [ {"a": "C", "b": 2}, {"a": "C", "b": 7}, {"a": "C", "b": 4}, {"a": "D", "b": 1}, {"a": "D", "b": 2}, {"a": "D", "b": 6}, {"a": "E", "b": 8}, {"a": "E", "b": 4}, {"a": "E", "b": 7} ], "name": null, "format": null }, "mark": "bar", "encoding": { "x": {"field": "a", "type": "nominal"}, "y": {"aggregate": "average", "field": "b", "type": "quantitative"} } } ``` ::: 而在Vega-Lite Getting Started Code中,我們上面說道的格式進行拆解,並可以的劃分為以下三類: 1. data : 資料矩陣 >Json格式的矩陣,例如 ```json [ {"a": "C", "b": 2}, {"a": "C", "b": 7}, {"a": "C", "b": 4}] ``` 2. mark : 圖表種類 >比如說點圖(point),直方圖(bar) ```json "mark": "bar", ``` 3. encoding : 資料顯示方式 >哪筆資料為X軸,哪筆資料為Y軸,以及axis的顯示名稱控制 ```json "encoding": { "x": {"field": "a", "type": "nominal"}, "y": {"aggregate": "average", "field": "b", "type": "quantitative"} } ``` --- ## Data 資料集合的格式定義了程式該如何讀取它。基本上,Vega Lite使用表格數據集(Tabular data set)的資料,比如說電子試算表(spreadsheet)或是資料庫的表格(database table)等。 ### Vega Lite支援多種資料輸入方式 Vega Lite實際上支援多種輸入方式: 1. Inline Data : 直接將資料數值輸入於code中。 3. Data from URL : 透過自動讀取url中的資料,自動將資料轉為所需格式,支援種類有`json`, `csv`, `tsv`, `dsv` 1. Named Data Sources : 從伺服器中讀取檔案資料 > 由於才剛接觸,因此以下先以最簡單的Inline Data進行介紹。詳細規格請詳讀[^data]。 ### 表格與Json格式轉換與定義方式 若要表示Tabular data,Vega Lite標準上市使用json格式的資料進行定義,以下將進行定義方式的舉例。 * **假設有一筆資料如下:** | name | data | |:----:|:----:| | a | 2 | | b | 5 | | c | 6 | | d | 1 | 在json中,主要可以將資料拆解為`key`以及`value`,也就是說上方的表格如果使用json進行表示,`key`即為`"data"`,而`value`即為2,5,6,1的資料 * **json格式表示為:** ```json [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] ``` :::info 注意,如果將格式寫成 ```json [ {"name": ["a","b","c","d"],"data": [2,5,6,1]}] ``` 實際的表格將如下,與上方表格所表示的排列方式有所出入,需要注意。 | name | data | |:-----------------:|:---------:| | ["a","b","c","d"] | [2,5,6,1] | ::: * **如果是更複雜一點的資料表格:** | series | year | month | count | rate | date | |:----------:|:----:|:-----:|:-----:|:----:|:------------------------:| | Government | 2000 | 1 | 200 | 3.2 | 2000-01-01T08:00:00.000Z | | Government | 2000 | 3 | 500 | 5.1 | 2000-03-01T08:00:00.000Z | | Government | 2000 | 5 | 700 | 4.5 | 2000-05-01T07:00:00.000Z | * **josn的格式如下** ```json [ {"series":"Government","year":2000,"month":1,"count":200,"rate":3.2,"date":"2000-01-01T08:00:00.000Z"}, {"series":"Government","year":2000,"month":3,"count":500,"rate":5.1,"date":"2000-03-01T08:00:00.000Z"}, {"series":"Government","year":2000,"month":5,"count":700,"rate":4.5,"date":"2000-05-01T07:00:00.000Z"} ] ``` ### 加入Vega Lite的Inline語法 在了解表格如何轉換成json格式後,我們需要將完成後的json資料依據Vega Lite的規格進行定義。 * 在Data中,主要有3個Inline Data,分別為: | 屬性 | 種類 | 功能敘述 | |:----:|:----:|:-------- | | values | Inline Dataset |***(必須)*** 可以是矩陣、數值資料、物件、字串(字串將依據format進行解析) | | name | String | placeholder | | format | [DataFormat][DataFormat_url] | Text | 實際code中的格式如下: ```json { "data": { "values": null, "name": null, "format": null } } ``` 為了讓Vega Lite的圖表可讀取我們所輸入的json資料,需要將我們先前定義的json資料格式放入`data`的`values`屬性中,而由於`name`以及`format`屬性在此次中並無使用,故定義為`null`(或直接刪除),結果如下: ```json { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ], "name": null, "format": null } } ``` 完成後我們即可在往後的`encode`中使用此次定義的資料囉。 [DataFormat_url]:https://vega.github.io/vega-lite/docs/data.html#format "https://vega.github.io/vega-lite/docs/data.html#format" --- ## Encoding Data with Marks 現在,我們已經完成資料建立了,接下來就可以進行圖表種類和顯示方式的定義~ ### Marks[^marks] Vega Lite支援眾多的圖表格式,文件中提到了`area`、 `bar`、 `circle`、 `line`、 `point`、 `rect`、 `rule`、 `square`、 `text`、 `tick`、 以及 `geoshape` ### Marks與Encoding的搭配使用 :::success ```vega { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] }, "mark": "point", "encoding": {} } ``` ```json= { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] }, "mark": "point", "encoding": {} } ``` ::: :::success ```vega { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] }, "mark": "point", "encoding": { "x": {"field": "name", "type": "nominal"} } } ``` ```json= { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] }, "mark": "point", "encoding": { "x": {"field": "name", "type": "nominal"} } } ``` ::: :::success ```vega { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] }, "mark": "bar", "encoding": { "x": {"field": "name", "type": "nominal"}, "y": {"field": "data", "type": "quantitative"} } } ``` ```json= { "data": { "values": [ {"name": "a", "data": 2}, {"name": "b", "data": 5}, {"name": "c", "data": 6}, {"name": "d", "data": 1} ] }, "mark": "bar", "encoding": { "x": {"field": "name", "type": "nominal"}, "y": {"field": "data", "type": "quantitative"} } } ``` ::: --- ## 後記 在Vega-Lite中,其實不僅僅只有上面提到的,還有文字轉換和計算拉`transform`、長寬設定拉`height` `width`,之類的比較進階一點的用法,往後等筆記完工後再進行轉跳工作。 [^Getting_Started]:[Vega-Lite Tutorial - Getting Started](https://vega.github.io/vega-lite/tutorials/getting_started.html "https://vega.github.io/vega-lite/tutorials/getting_started.html") [^data]:[Vega-Lite Data詳細格式](https://vega.github.io/vega/docs/data/ "https://vega.github.io/vega/docs/data/") [^marks]:https://vega.github.io/vega-lite/docs/mark.html "https://vega.github.io/vega-lite/docs/mark.html"