2017年1月30日 星期一

從試算表產生柱柱圖(三次元長條圖)

過去三十年北半球每月平均溫度跟 1951-1980 當月平均溫度差異值的 3d 長條圖 有沒有冬天越來越不冬天的八卦? 可是川普王說全球暖化是騙人的耶... 那就趁 NASA 的資料還沒被下架之前趕快到 NASA 的 地表溫度歷史記錄 去下載資料回來分析吧。 如果把北半球地表及海面上所有觀測站的溫度按月平均, 再減去某段很長時間 (例如 1951-1980) 同一月份的歷史均溫, 就可以看出溫度異常 (anomaly) 現象有沒有越來越嚴重了。

本文其實是要介紹我寫的 colchart 裡面的兩隻小程式。 假設你有一個數字二維陣列 (例如從試算表匯出的 *.csv 檔, 或是 1987 到 2016 北半球每月平均溫度異常表, 點 raw 下載)。 用 mat2list.pl 可以把它轉成 gnuplot 認得的資料格式, 再用 pt2sq.pl 可以把每一筆資料轉成四筆, 然後就可以畫出 3D 版的長條圖 -- 稱為 column chart。 可能是因為部分的資訊會被遮住, 所以這種圖表不太流行。 但是在 gnuplot 裡面, 畫好 3D 圖後還可以拉著柱柱們旋轉, 從各個方向觀賞, 死角比較少, 很適合在會議簡報上製造物美價廉的視覺效果。

過去三十年北半球每月平均溫度跟 1951-1980 當月平均溫度差異值的 「崎嶇地形圖」 就拿上述的 temperature.csv 為例吧。 先下: ./mat2list.pl -r '1987:' -c '1:' temperature.csv > rugged.txt 這會把矩陣形式的資料變成一列一列 "r c z" 形式的資料, 存入 rugged.txt。 其中 r 是列次 (0、 1、 2、 ...), c 是行次 (0、 1、 2、 ...), z 是矩陣裡原來的資料。 還有, 每處理完陣列的一列資料, 會多印一個空白列。 對 gnuplot 的 splot 指令來說, 它會把這樣的檔案解讀成網格狀的 "x y z" 座標, 畫出一個崎嶇的 3D 地形圖。

如果在命令列上加上 -r '100:5' 那麼 x 座標會變成 100、 105、 110、 115、 ...。 同理, -c '-40:2' 會讓 y 座標變成 -40、 -38、 -36、 -34、 ...。 如果省略起始值, 就從 0 開始; 如果省略步伐, 就每次加 1。 也就是說, 預設的 -r ':' 相當於 -r '0:1' 還有 -t 可以對調行列 (改印 "c r z"); -d ':' 可以指定改用 「:」 (而非 「,」) 來作為輸入檔的分隔符號。

但是如果想畫 3D 柱柱圖呢? 根據 這一節 的提示, 只要要把 rugged.txt 裡面的每一個點改成四個點就可以了。 這四個新的點與 rugged.txt 當中的原始點等高 (相同的 z 座標), 但 x 及 y 座標則位於四個角落。 下 ./pt2sq.pl rugged.txt > colchart.txt 指令, 就可以產生四倍大小的 colchart.txt。 預設是以原始點的 x±0.5 及 y±0.5 作為四個角落的座標; 如果你的資料的 x 間距是 5 而不是 1, 那就要指定 -x 5。 同樣地, 如果資料的 y 間距是 2, 那就要指定 -y 2pt2sq.pl 不會自動從資料檔中推算 x 間距及 y 間距!

最後, 請進入 gnuplot、 執行 load "colchart.gpt" 美美的柱柱圖就出現囉! 旋轉吧, 柱柱! 簡報時切換到 gnuplot、 拉著柱柱們跳舞, 是不是比 powerpoint 特效更有意義得多呢? 關於 pm3d 的色板設定, 請在 這份講義 裡搜尋 「gray」 看更多範例。

看來藍星真的有越來越熱的趨勢耶, 而且冬天溫度異常高的現象好像又勝過夏天。 不知道川普王會不會下令築一道長城阻擋陽光入侵...

沒有留言:

張貼留言