哈佛教授公開R語言原始碼,教你用R製作gif動圖

weixin_33686714發表於2017-08-23

作者Rafael Irizarry是哈佛大學以及the Dana-Farber Cancer Institute的應用統計教授,他專注於研究基因組學,並且教授數門資料科學課程。在本文中他公開了自己授課時所使用的gif動圖的R語言原始碼,同時也對涉及的幾個話題進行了簡單的論述,對於希望瞭解資料科學原理、如何使用R語言來進行視覺化的讀者都有所助益。


本文長度為1800字,建議閱讀4分鐘。

本文授權轉自資料派THU(ID:DatapiTHU)

作者 | Rafael Irizarry

翻譯 | 賈琳

在日常教學的過程中,我有時會用動畫來形象地解釋概念,並且通過 @rafalab賬號(https://twitter.com/rafalab)在社交媒體上分享。

John Storey最近問我是否可以公開這些原始碼。由於我不甚有條理,而且這些動畫都是靈機一動想出來的,所以之前這些程式碼分散在幾個不相關聯的檔案中。John的請求促使我把這些程式碼整理在一起釋出在這裡。

所有的gif動圖都是用R語言繪製的數張圖片的疊加。在程式碼中你可以發現,我用幾種不同的方法將單獨的圖片轉化成動態gif圖。

第一種方法(不推薦)是將圖片檔案儲存下來,然後呼叫ImageMagick轉化工具(https://www.imagemagick.org/script/index.php)。

在R環境下,我現在使用的方法是animation包的saveGIF函式,這是通過讀者Yihui Xie在我simplystats部落格下面的評論學習到的。當用ggplot畫圖時,我會使用David Robinson的gganimate包(https://github.com/dgrtwo/gganimate)。

最後一種方法是我在加特效(例如調相)時會用到的:線上Animated GIF maker(https://ezgif.com/maker)。

以下就是這些gif動圖的原始碼,我大致按流行程度排序。因為程式碼是很著急寫出來的,請不要過於苛責我。事實上,你可以隨意批判,這就是我們學習的方式。

辛普森悖論

這張gif闡述的是辛普森悖論:我們看到X變數和Y變數有很強的負相關關係。不過,一旦我們用一個混雜因素Z變數進行分層,用不同顏色來表示Z,每一層中的相關性就會轉化為正相關。這裡的資料是虛構的,不過假設說X代表學生參加輔導的次數,Y代表九年級的測驗分數,然後再用八年級的測驗分數Z來對學生進行分層,我們也會發現這樣的現象。


這張動圖僅用三張圖片組成。我用RStudio的Export功能將它們把存下來,然後用Animated GIF maker(https://ezgif.com/maker)來製作gif。以下是這三張圖片的程式碼:


區域性加權迴歸散點平滑法(Loess)

我分享的第一個教學動圖是為了解釋區域性加權迴歸散點平滑法(Loess)的原理。具體來說,我們對於每一個自變數,比如x0,都讓其對任何一個臨近點有正的加權值,用加權迴歸擬合一條線,保留經過擬合所得的結果,然後移動向下一個點。


這裡的資料來源是某個基因晶片實驗。圖中所示的是MA圖,即比例對數與對數平均值之間的關係。我用animation包來儲存gif動圖。


預期壽命 vs 生育率

這個gif動圖是複製Hans Rosling(https://en.wikipedia.org/wiki/ Hans_Rosling)在他的演講“關於貧窮的新發現”—New Insights on Poverty,(https://www.ted.com/talks/ hans_rosling_reveals_new_insights_on_poverty?language=en)中展示的動畫。

該圖很好地展現出資料視覺化在消除誤解方面的作用,Hans Rosling通過這張動圖展示瞭如今並不如40年前一樣能夠簡單將世界劃分成兩半。之前,人們一般把世界分為擁有更長壽命、較少家庭人口的西方富有國家和較短壽命、較多家庭人口的發展中國家,而這個圖向我們展示了這種劃分的不合理性。


感謝gganimate包,畫這個圖使用的程式碼非常簡單。


聯合國選舉模式

這裡,我們使用Erik Voeten和Anton Strezhnev提供的聯合國選舉資料來闡釋距離的概念。


以下是程式碼。整理資料的程式碼是由David Robinson(https://twitter.com/drob)提供的。你會看到我們將隨時間變化的距離進行了平滑處理,從而避免一些點跳動範圍過大。




隨機森林

在過去的很長一段時間裡,我都覺得很難理解為何隨機森林作為一種基於樹的演算法,卻能夠產生平滑的預測。這裡的gif圖幫助我理解了原因。我用的是2008年總統選舉的資料庫,因為我認為該資料的趨勢總體是平滑的,但是有幾個尖銳的邊,就連區域性加權迴歸散點平滑法都很難預測。需要注意的是,我們只有一個影響因素,這個gif並不能展示出隨機森林的另一個重要特點:隨機的特徵選取可以減少樹與樹之間的相關程度。


你可以看到我在程式碼中使用的方式是傳統的、我並不推薦的方式:儲存所有的圖片檔案然後呼叫系統指令轉化。



生態謬誤

在分享辛普森悖論的動圖以後,有些人問我生態謬誤是不是相同的情況。其實這二者是不同的。生態謬誤是我們試圖通過平均值的強相關性來推斷個體之間的相關性。為了更好的解釋,我用dslabs包中自帶的gapminder的資料(http://gapminder.org/)畫出了一個動圖,展示新生兒存活率的對數與日均收入的對數之間的關係。可以看到在地區層面上二者相關度很高,但在各個國家層面上相關度很低。這是因為同一地區國家與國家之間的差異導致的。



這張gif只由三張圖構成。我用RStudio的Export功能儲存圖片,然後用Animated GIF maker(https://ezgif.com/maker)來製作gif。

第一張圖是地區平均值;撒哈拉以南非洲國家的數值,你可以看到一個平均值被分成數個不同的數值;第三張是所有國家的情況。我標出了一些(與本地區相比)變化較大的國家,並且用了色盲也能識別的顏色。這裡的程式碼有些複雜,原因是我不得不對Gapminder資料進行預處理。




貝葉斯定律

這個簡單的動圖展示的是將一種非常準確的診斷方法應用於一個發病率很低的群體的診斷結果。它展示出來的是,在已知診斷結果是陽性的情況下發病的先驗概率,比該診斷方法的初試準確率要低。你可以用貝葉斯定律來確定真實的條件概率。

更多細節請參考這裡

https://simplystatistics.org/2014/10/17/bayes-rule-in-a-gif/


因為我們要做動態圖,程式碼有一些複雜難懂。


吃豆子

最後,我做了這個動畫,向你們展示餅圖唯一的用處。




原文標題:

Code for my educational gifs

原文連結:

https://simplystatistics.org/2017/08/08/code-for-my-educational-gifs/

譯者簡介:賈琳,清華大學2012級本科畢業生,現就讀於美國達特茅斯學院工程管理碩士專業。愛好資料分析、資料科學,期待在資料派THU這個平臺上向更多志同道合的朋友學習和交流。


相關文章