2018年9月2日 星期日

資料視覺化幫我重新發現克卜勒第三定律

如果你沒空看 18 分鐘的 TED 演講 Hans Rosling 用前所未有的方法詮釋數字統計, 那麼至少要欣賞一下這個 4 分鐘的短片 「200 年, 200 個國家」:

資料視覺化可以幫我們從枯燥的數字當中, 一眼看出奇特、 令人驚訝的現象。 而且即使我們手邊沒有任何特殊的資源, 還是可以玩出一些有趣的東西。 今天我們要重新發現 (天文學上的) 克普勒第三定律。

我們省略上一篇 用 perl 的 csv 句型處理維基百科頁面 的繁瑣過程, 直接下載成果檔 satellites.csv。 這是太陽系所有天然衛星的列表, 包含 name (名稱)、 radius (星體半徑)、 orbit_major (軌道半長軸)、 rev_cycle (公轉週期)、 planet (所屬行星) 等等欄位。

我們用 gnuplot 來畫圖:

set datafile separator ","
set encoding utf8 # 萬一資料裡有中文的話
plot "satellites.csv" using 3:4:1 with labels

咦, 有幾顆衛星在很遙遠的右上角; 其他大部分都擠在圖的左下角。 這種情況最適合用 log scale 了:

set logscale
replot

咦, 衛星們很明顯地分佈在 「左下到右上」 的幾條直線上。 會不會跟它們所屬的行星有關? 在命令列視窗的另一個分列下: perl -pe 's/(\w)(\w+)$/$1/' satellites.csv > sat.csv 把最右邊一欄 (所屬行星的名字) 改成只剩第一個字母, 這樣等一下圖看起來比較清爽。 在有衛星的所有行星當中, 恰好只有最遙遠的矮行星 Eris 跟地球兩者具有相同的第一個字母; 其他行星的第一個字母通通各不相同。 手動把最後一列的 E 改成 e。 再回到 gnuplot 分頁:

plot "sat.csv" using 3:4:5 with labels

Bingo! 超級明顯: 木衛通通在最右下方的那條直線上; 上面一點那條線則是土衛群聚的地方; 再上去的兩條幾乎重疊的線佈滿了天王星跟海王星的衛星; 再上去, 地球跟火星的衛星幾乎落在同一條線上; 最上面幾條直線上的, 則是矮行星的衛星們。 直線的位置顯然跟所屬行星的質量大小有關。

太陽系天然衛星的軌道半長軸與公轉週期的關係, 按所屬行星標示 接下來, 數學厲害的同學就開始算 curve fitting ; 而擅長搜尋的同學則會找到 克卜勒 (關於星體的) 三大運動定律, 其中第三定律就是:

p2 = a3 * 4 π 2/(G(m1 + m2)) 

上式中的 p 是公轉週期、 a 是軌道半長軸、 m1 跟 m2 是行星與衛星質量 (差很多時, 可忽略衛星質量)、 G 是萬有引力常數。 兩邊取 log 時, log(p) 跟 log(a) 正好是線性關係; 主星的質量影響直線的位置但不影響直線的斜率。

如果維基百科、 perl 的 csv 句型、 gnuplot 這幾個工具的適當組合, 就可以讓沒有受過正式天文訓練的電腦宅重新發現克卜勒第三定律, 那麼當物理、 化學、 生物、 ... 等等各領域的同學們學會使用這些工具時, 又還有更多哪些有趣的東西會被挖掘出來呢? 不要為程式而程式, 要以最少的指令畫出有意義的圖, 我很想開這樣的通識課啊~~ (然後穿插股票資料視覺化的範例...)

2 則留言:

  1. 我最近也開始研究 diagram, 繪圖 的東西,我的目的不太一樣,不是要資料視覺化,我只是覺得以前寫程式時,重來不先畫藍圖,這樣的工作流程不太有系統,應該先畫個藍圖之類的,至少要有流程圖。

    所以我最近開始邊畫流程圖 (flowchart) 邊構思我想寫出的小系統。我也開始需要用到關係圖 relationship map 來把複雜的系統,簡化的取出裡面比較重點的 "主角",描述出來。但是我之後發現,關係圖不應該 "用手畫",尤其還要去想每個 "主角" 在畫布上的擺放位置,還有避免 "連接線" 經過的路徑閃過 "障礙物",這些很 "手功" 的工作,這讓我相信一定有一些現成的工具,可以把這些資料 (比如 json),直接視覺化。

    d3.js 可能 overkilling 了,我只不過想畫關係圖。我還在找,我不需要功能很多,我的工作很單純。gnuplot 我還沒研究過。

    回覆刪除
  2. 才想要告訴你 graphviz 就已經被你發現了嘛 :-) 而且找到這麼讚的文章: http://melp.nl/2013/08/flow-charts-in-code-enter-graphviz-and-the-dot-language/ 他的論述完全就是我的菜 :-) 先前學 graphviz 也是需要用到時才隨便學一點, 學過又忘記, 每次都要把舊的 .dot 檔抄出來改。 而且沒有哪一門課程大量需要它, 所以也不曾寫過較有系統的教學文。 倒是上課閒聊談到 FB 的朋友圈、 擋修課程、 族譜、 ... 等等相關議題時, 有時會用 google 的 image search 搜尋 「graphviz」 給學生看。 光是讓學生知道可以用這種方式畫圖、 讓他們跳脫滑鼠選單的思考框框, 我相信就已經幫助了一些學生。 treegb 分享的連結都很讚, 謝謝長期支持!

    回覆刪除