哈佛教授公開R語言源碼,教你用R製做gif動圖

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


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

本文受權轉自數據派THU(ID:DatapiTHU)github

做者 | Rafael Irizarry算法

翻譯 | 賈琳數據庫

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

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這個平臺上向更多志同道合的朋友學習和交流。
相關文章
相關標籤/搜索