Rawgraphs 是一套很適合入門者的網頁版資料視覺化自由軟體。 不必下載軟體, 只需要到示範網址 ("Use it now!" 點下去)、 上傳你的 csv 檔、 決定你想畫哪一種圖、 決定要用哪些欄位, 馬上就幫你產生圖形。 這裡 有一篇入門的中文教學, 我就不再重複介紹基本的操作了。 以下是我的一些使用雜記。
一、 隱私 & docker
Rawgraphs 官網強調一切運算都在瀏覽器裡面發生,
你的資料不會被傳到伺服器去。
但如果你的資料高度敏感 (例如客戶的個資),
還可以更進一步下載
Dockerfile、
放在一個空目錄裡、 進入該目錄、 用 docker build -t rawgraphs .
自行在本機建立一個 docker image。 這樣就可以完全離線執行了。
成功之後, 可以用 docker run -d --name rg0 -p 3072:3000 rawgraphs
啟動, 並且將瀏覽器指向 localhost:3072。
啟動的時間有點久。 最終會看到跟示範網址相同的介面。
電腦關機再開之後, 要用 docker start rg0
重新啟動這個 container。
二、 準備資料
即使你沒有自己的資料可以玩, 也可以點
"Try our data samples" 裡面有現成的示範資料。
我自己則最常用 "Upload your data" 上傳 csv 檔。
假設你已按照 試算表的 unpivoting/melting 這篇
產生了 electricity-mix-hierarchy.csv。
接下來可以這樣: ( head -n 1 electricity-mix-hierarchy.csv ; grep ',2020,' electricity-mix-hierarchy.csv ) > em20-hierarchy.csv
只抓出 2020 年的資料, 得到 em20-hierarchy.csv。
上傳之後, 在 "Year" 欄位前面有個 "#", 表示 rawgraphs 認為它是個數值欄位。 點下去, 把它改成 "Date" => "YYYY"。 這裡其實沒差啦, 反正 rawgraphs 不論把它當成時間還是數字, 排序都不會出錯, 更何況我們也沒有要用到這個欄位。 但如果你的日期格式是 02-03-2023 之類的, 就必須靠這個動作告訴 rawgraphs 到底資料格式是 日-月-年 還是 月-日-年。
如果資料裡面有空的欄位, 有時 rawgraphs 會罷工。
例如上面如果抓 1980 年的資料, 等一下在做 mapping 時, 就會出錯。
這時可以先在命令列上把空白處都填上 0:
perl -pe 's/,,/,0,/g; s/,,/,0,/g; s/,$/,0/' 缺資料.csv > 補滿補好.csv
說明: 這裡的 s/,,/,0,/g
要做兩次,
是因為如果有很多連續的空白處, 有些逗點必須被比對兩次,
一次當 "後逗點", 另一次當 "前逗點"。
三、 mapping
以我們的 hierarchical 類型例子而言, 「圖表類型」 可以選擇 treemap、 treemap (voronoi)、 sunburst、 circle packing 或是 circular dendrogram。 以下以 treemap 為例。 選好圖表類型 之後, 再來就是決定 「欄位」 與 「圖表參數」 之間的對應。 大推 官方的 mapping 文件。
Hierarchy 欄位可以塞進 csv 的很多欄, 按照由粗而細的順序放, 例如 「縣市」、「鄉鎮」、 「村里」。 以我們的例子來說, 可以選 continent、 type、 source 共三層。
任何數值欄位 (有 "#" 的欄位) 都會面臨一個問題: 如果有好幾列的資料被塞進圖上的同一塊區域 (或同一條 bar、 同一片 pie、 ...), 那該如何整合這些資料? 官網 mapping 文件中的 「aggregations」 就是在解釋這部分。 最普通最合理, 也是預設的方式, 就是加總: "sum"。 例如圖上最大那一塊 「亞洲-煤礦」 包含很多列 (很多國家的煤礦列), sum 當然是最合理的選擇。
"Label" 欄位也可以填 csv 表格裡的不只一欄。 我這裡先填 continent 跟 source, 自己確認每一大塊是哪一大洲之後, 可以再刪除 Label 底下的 continent、 匯出 svg、 進入 inkscape 編輯、 手動幫每一大塊加上洲名。
四、 其他
- 表格裡可以有多餘的欄, 不可以有多餘 (沒用到) 的列。
- 目前 bubble chart 沒有支援 logscale。 我已提出建議。
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。