用R繪製遷移軌跡圖
「您到這個世界才不久,過不了幾年又要離開的,怎麼居然以為在這裡找到了歸宿?」
——波伏娃《人都是要死的》
之前看到這個唐宋文學編年地圖,便想著用R重新繪製下這些唐宋名人的遷移軌跡,這次先畫王勃的。
畫圖用的底圖可以用谷歌地圖,安裝ggmap包後一行命令便可輕鬆調用。ggmap具體怎麼用,大家help一下就好,或者搜索一下,網上有很多教程實例。
我這裡說一個網上很少講到的小技巧,因為ggmap使用的是谷歌地圖的默認樣式,圖上除了一張普通的地圖之外,還會有道路、標籤、邊界線等元素。這樣圖會顯得很雜亂,影響觀感。而且在部分敏感地區,邊界線和行政區劃的標籤容易犯政治錯誤。
谷歌地圖的默認樣式
Google Maps API提供了一個樣式化地圖的選項,你可以在裡面選擇自己想要的樣式,強調特殊內容,或者隱藏不需要的內容,自定義谷歌地圖的顯示。具體介紹可參見網址:https://developers.google.com/maps/documentation/static-maps/styling (需要梯子)。
樣式化地圖在ggmap包里具體操作,就是在調用地圖的函數get_googlemap( )里添加一個「style =」參數即可。參數的設置與網址里的格式一致。如,feature表示選擇進行此樣式修改的特徵。特徵包括地圖上的內容,例如道路、公園或其他景點。element表示指定特徵中選擇進行此樣式修改的元素等。
需要注意的是,API 將按規則在 style 聲明中出現的順序應用相應規則。另外,只要在 Google Static Maps API 的正常網址長度限制內,我們可以添加任意數量的規則。
比如,我接下來使用的底圖設置了這樣的樣式:
stylex="stylex=feature:administrative|element:labels|visibility:off&stylex=feature:landscape|element:labels|visibility:off&stylex=poi:landscape|element:labels|visibility:off")
我在maptype里選擇了「terrain」,然後在樣式里去掉了行政區劃的標籤和其他一些景觀、景點、道路的標註。最終呈現如下:
底圖選好了,我們開始畫圖,(此處省略一千字)。
下面這張呢,就是王勃一生的遷徙軌跡圖,每一個地點我都用數字標註了他到達的順序。
當然,我知道,還是啥都看不清楚。既然是軌跡圖,可能還是動圖會更清楚一些。於是我做了個GIF,但是好像文件太大了,無法上傳。
於是我只好壓縮再壓縮。
最後畫質成了個這。
我們站在上帝視角看古人的人生軌跡,自有諸多感慨,但我們也不知道自己尚有多少年月。
但生命的有趣的地方就在於你不知道大限在何時,所以你便會專註於此刻你最想做的事吧。若王勃寫《滕王閣序》時知道自己死之將至,定不會感慨「勃,三尺微命,一介書生。無路請纓,等終軍之弱冠;有懷投筆,慕宗愨之長風」。
上圖中,王勃進入四川盆地之後,那個點就看不太清了,於是我在主圖中添加了一張四川盆地的輔圖。這個輔圖不是後期用圖片處理軟體加上去的,而是可以通過命令行直接生成。
生成圖中圖的代碼也很簡單。首先通過viewport( )函數設置輔圖的大小和位置,然後直接用print先後輸出主圖(p)和輔圖(g)即可。如下所示。
好像四川盆地還是放的不夠大,點還是擠在一起 = =
還有一個小技巧是針對軌跡連線的,當然這裡各個點之間都是用直線連起來的,看上去有些生硬,我們可以通過載入geosphere包,使用gcIntermediate( ) 函數將兩點之間的連線圓弧化。
其實上面幾張圖是已經圓弧處理過的連線,但由於距離太短,所以並不明顯。我們可以看下在更遠一點的距離上,將連線圓弧處理後的效果。
這張是未處理過的連線:
這張是圓弧化後的連線。
可見距離足夠遠時,效果還是很明顯的。這個技巧可以用在航線圖上,一來顯得不那麼生硬,二來可以避免有重合路線的航線被覆蓋住。
跟王勃比,我的人生軌跡則單薄得多了 XXD
推薦閱讀:
※Live學習筆記——R語言入門與基礎繪圖系統
※可視化:ggplot2包、lattice包、rCharts包
※【數據分析·實戰】北京的霧霾是大風吹走的嗎