Game of Life的輸出結果,也就是每代演化後universe的長相,程式要怎麼寫呢?現在有個二維list,裡頭放的是一堆0和1,要怎麼樣用西洋棋盤式的方式來顯示呢?這看來勢必得用到別人寫好的module來做,才能省時、省力又漂亮。第一個想到的,當然就是matplotlib這個科學繪圖用的module了,但到底合不合用,要試過才知道,如果不盡人意,再換其他module試試。
既然要用matplotlib,那就得先研究一下裡頭有些什麼東西可以用,還有這些東西的用法。碰到這種人家寫好的工具,第一件要做的事,當然就是到官網看看。
畢竟是一個已經發展了很久、很多人使用的module,官網的資料非常多、非常詳盡,詳盡到讓人看了心慌慌,腦袋一片空白。這麼多的資料要看到什麼時候啊?!我要的,就只是畫個簡單的圖而已,有必要鉅細靡遺的把所有功能都研究得很透徹嗎?當然不!既然要的不多,那就找出需要的部分就好。寫程式遇到新的東西,可不能每次都從頭到尾把所有文件都看過才開始寫,這樣子的效率太差了。以前有陣子覺得,學新東西,就是要全盤掌握。如果有書的話,那就要從頭到尾,一個字一個字啃完。後來發現這樣不行,太沒效率了,新東西出現得又快又多,啃書的方式不適合。所以現在的做法是,只研究需要的部分,其他的,有時間的時候,再慢慢研究。
「只研究需要的部分」,這話說得輕巧,但真要有這麼簡單就好了,既然是沒學過的新東西,又怎麼知道哪些是現在需要的,哪些又是可以先不理會的?所以囉,這種做法,比較適合用來研究已經有一些概念的新東西,這樣才能事半功倍。說到這,就想到念英文時,總有高手會教說,看文章遇到不認識的單字時,先不要查字典,整段先看完,利用上下文或許就能猜到那個不認識的單字是什麼意思。對於高手來說,這方法絕對管用。可是不知道高手有沒有想過,對於低手來說,可能整段文字,有超過一半以上都是不認識的單字,那是要怎麼根據上下文來猜啦?!回想上大學時,第一次讀專業科目的原文書時,就是這種滿滿的低手的心情。所以說,每種學習方法都有它適用的情況,用對了,讓你上天堂;用錯了,讓你住在滿滿的挫折感套房中。
言歸正傳,那要怎麼和matplotlib打交道呢?從一些網路上查到的簡介來看,語法和matlab其實差不多。這就好辦了!這樣重點就只在找到合用的method或function,設定好參數,然後把資料餵進去,就大功告成了。之所以這麼認為,是因為以前用過matlab,還有科學繪圖軟體Grapher,以及Excel的繪圖功能,所以對程式語法,還有畫科學圖表時的一些專用術語,都有一定程度的瞭解。這就好比整段英文中,大部分的字都認得,要從上下文猜那幾個生字的意思,應該會容易一些。
在matplotlib官網中,有許多範例,各式各樣的圖都有,不過就是沒有看到可以直接拿來改的。有幾張看著似乎有那麼一點可以拿來用的樣子,但看了一下範例程式,卻又有點摸不著頭緒。既然如此,那就自己從基本的圖樣來改造囉!
哪個基本圖樣適合用來顯示universe呢?毫無懸念,就是scatter plot。在universe中的每個元素,都有相對應的位置,也就是在第幾行、第幾列都很清楚。換句話說,每個元素就是一個資料點,而它在universe中的位置,就對應到資料點在scatter plot中的座標。畫出格線,點上資料點,然後用marker把格子填滿,這樣就大功告成了。
唉!事情要有這麼順利就好囉!資料點會落在格線的交叉點上,而不是格線的中心。這個好解決,調整一下格線的位置就可以。最要命的問題是:marker的大小要多大,才能剛好填滿格子,不會太大,也不會太小?這得慢慢的算、慢慢的調。即使調好了,萬一universe的大小改變了,或者需要調整圖的大小,那原先調好的marker大小,八成會破功要重調。唯一的解法,就是要讓marker的大小可以因應universe的大小和圖的大小自動調整。這看來沒那麼容易處理,因為得要知道matplotlib細部的運作方式才有辦法做到。不玩這個,另外想辦法。
雖然要放棄用scatter plot來畫,但既然都花時間研究了,那還是調整一下畫法,至少在看測試結果時,會比較舒服一些。那要畫成啥樣呢?格線當然要去掉,然後marker改用圓點,而且只畫活著的cell。畫出來的樣子差強人意,至少比看一堆0、1和逗號好多了。口說無憑,就長這樣: