在講述由數(shù)據(jù)驅動的故事時,,動畫往往比其他形式更加引人注目,。我們的眼睛天然地被鮮艷的色彩和動作所吸引。優(yōu)秀的可視化可以引起觀眾的興趣,,給他們留下深刻的印象,。幸運的是,一系列便捷的R語言包使可視化過程變得非常簡單,。本文中的所有可視化案例都可以進一步分解,,并在MatrixDS項目中運行。讀者只需要對基本繪圖有一定了解即可,。 在開始制作圖表之前,,首先應該問問自己:是不是非要做動態(tài)圖不可? 如果你正在進行探索性數(shù)據(jù)分析,,那么一個運動的圖形可能不是你的最佳選擇,。但是,,如果你需要進行演示,那么一些精心設計的動畫圖形可以讓觀眾更加了解你的演講主題,,這當然要比靜態(tài)的圖形展示更加富有表現(xiàn)力,。 創(chuàng)建動畫時,圖片實際上不會移動,。其實,,我們只是構建了很多單獨的圖片,然后像放電影一樣把這些幀串聯(lián)在一起,,就像是老式的翻書動畫和卡通片,。當制作動畫的時候,每一幀都來自不同的圖,。這些圖是利用聚合數(shù)據(jù)的子集構建的,,把這些子集縫合在一起就形成了動畫流動。 動態(tài)數(shù)據(jù)可視化的構成機制 數(shù)據(jù)的子集越多,畫面就會更加平滑,。這是動畫需要考慮的重要因素,。如果每一層的數(shù)據(jù)太少,最后只能夠生成幾幀,,那么動態(tài)效果就不那么明顯,。這種情況下,建議使用靜態(tài)面板圖,。這種圖可以在ggplot中創(chuàng)建,,比如使用分面。另一種方法是使用插值法和tweener包來擴展數(shù)據(jù)集,。 動畫的優(yōu)勢之一是它可以拓展我們能夠可視化的變量個數(shù),,我們可以讓數(shù)據(jù)集中的變量來“驅動”動畫,。上圖是利用含有六個變量的數(shù)據(jù)集構建的,動畫能夠很好地捕捉著這六個變量的變化,!數(shù)據(jù)樣式如下: 我們可以使用這六個變量中的任意一個進行動態(tài)顯示,。不過不動腦筋就隨便選是非常危險的,。有些變量比其他變量更適合動態(tài)顯示。例如,,動畫隨時間而發(fā)生變化是不言而喻的,;所以,,使用分類變量來生成動畫就會非常混亂,。 GDP可視化的正確使用方式:慢慢滾動,。 GDP可視化的錯誤使用方式:我不知道這圖在干什么…… 動畫在這些使用場景中比較有價值: 1. 隨著時間而變化,; 2. 迭代/遞歸技術產(chǎn)生的變化(比如梯度下降和貝爾曼方程) 3. 在隨機模擬中的變化 需要注意的關鍵點在于數(shù)據(jù)中的重要變化,,我們要用這個變化的變量來驅動動畫。 下面讓我們來進行實踐操作,!這些代碼都可以在MatrixDS項目中找到,。 程序包 推薦四個R語言動畫制作包: 1. animate: 可以讓任意格式的圖片動畫化,,作者是謝益輝 2. gganimate: 可以把ggplot創(chuàng)建的圖像動畫化,作者是Thomas Lin Pedersen 3. plotly: 一個具有動畫功能的交互式繪圖庫 4. googlevis: 基于Flash的動態(tài)圖制作方案 總體上講,,animate包提供了最全面的控制力,,對于基本圖形很有用,但代碼可能很冗長,。另一方面,,gganimate包僅支持一個繪圖庫,但可以非常容易地將ggplot轉化為動畫(在繪圖代碼中添加一兩行代碼即可),。與gganimate類似,,plotly只能對自身支持的繪圖進行可視化設置。Googlevis受到的限制是最多的,,只支持基于Flash的一種動畫制作,,這種圖的應用面越來越窄。 使用animate 使用animate包的話,如果你已經(jīng)參照文檔并安裝了所需的軟件,,可以導出五種格式的文件: 1. HTML (可以帶控件) 2. Video (mp4) 3. GIF 4. LaTeX 5. Flash 這個軟件包非常棒,,其中一大原因就是它提供了很多內(nèi)置的統(tǒng)計圖形作為示例。這里我們展示一個帶控件的HTML頁面,,它用動畫顯示了梯度下降的過程: library(animate) desc = c('This is a super cool example of Gradient Descent') saveHTML({ f1 = function(x, y) x^2 + 3 * sin(y) xx = grad.desc(f1, pi * c(-2, -2, 2, 2), c(-2 * pi, 2)) xx$persp(col = 'lightblue', theta = 30, phi = 30) },title = 'Demo of Gradient Descent', description = desc, verbose = FALSE) 梯度下降的示例(利用animate包) 有的時候你希望用戶能夠使用控件來控制動畫效果。在這個示例中,,你可能想要通過暫停3D曲面圖像來得到最后一幀的圖片,。具有此類控件的動畫實時版本托管在MatrixDS項目中的靜態(tài)Web服務器上。 這個軟件包最強大的功能是可以使用任何可視化工具來搭建框架,,例如上面對比可視化是否合適的案例就是使用了animate和ggplot來構建的。 使用gganimate 使用gganimate包,默認導出是GIF格式的文件(使用gifski,,必須先安裝rust),。不過根據(jù)用戶的具體要求,還可以導出其他格式,。本文中的第一個動畫示例是使用gganimate包構建的(實際上它是包中自帶的README文檔中唯一完整的實際數(shù)據(jù)示例),。下面我們展示這個軟件包wiki中的另外一個案例,最終輸出了一個視頻格式的文件(作者是Tom Westlake),。這是一個Anscombe四重奏的新變換,,這一系列的圖都有同樣的統(tǒng)計學匯總數(shù)值,其中一個圖看起來像一個恐龍,!所有的這些只需要在ggplot基礎上加入幾行額外代碼,。 library(datasauRus) library(ggplot2) library(gganimate) ggplot(datasaurus_dozen, aes(x=x, y=y))+ geom_point()+ theme_minimal() + transition_states(dataset, 3, 1) + ease_aes('cubic-in-out') 這是數(shù)據(jù)小恐龍! 使用Plotly 最后一個要介紹的包是plotly,,很多可視化從業(yè)者與這個包都有過充滿愛恨情仇的故事,。它讓我們能夠簡單地創(chuàng)建精美的交互式圖,但是操作簡單是以靈活性和風格的損失為代價的,,而且繪圖之后你還必須想辦法清除plotly的logo,。不過我覺得這些麻煩事還是值得的。下面的例子中,,我們演示了plotly文檔的一個示范(使用了frame參數(shù)),。它跟上面的gganimate包的例子一樣,都使用了gapminder數(shù)據(jù)集: library(plotly) library(gapminder) p <- gapminder="" %="">% plot_ly( x = ~gdpPercap, y = ~lifeExp, size = ~pop, color = ~continent, frame = ~year, text = ~country, hoverinfo = 'text', type = 'scatter', mode = 'markers' ) %>% layout( xaxis = list( type = 'log' ) ) 一旦你完成了繪圖,,就可以將其送入plotly的托管服務,。這里面你可以使用所有繪圖的嵌入組件,包括播放按鈕,。這其實上是在媒體上獲取交互式圖形的少數(shù)方法之一,! 它的一個缺點是,免費版的圖形托管服務最多只能放25張圖,。 Gapminder可視化的plotly版本(https:///~RPlotBot/4595.embed?autosize=true&referrer=https%3A%2F%2Ftowardsdatascience.com%2Fmedia%2Fe98cacd5d473a475392495880b6ed2e2%3FpostId%3Df94ae20843e3) 小結 現(xiàn)在,,你擁有了在R語言中構建動畫可視化所需的一切。你可以將這些動畫放在演示文稿,、網(wǎng)站和博客中,。 編譯組:韋振琛,、黃天元 -> |
|