編者按:本文作者 Meng Qi,來自 Teradata Data Science 團隊,牛津大學統計系 2013 屆研究生。本期博文,就讓我們了解一下 R 語言如何進行數據可視化

。當統計學家最愛的 R 遇上 「A graph is worth a thousand words」 的可視化工具,會發生什麼呢?

歡迎掃碼關注數據科學公眾號

掃碼關註:數據科學一線

目錄

R 的繪圖系統

graphics lattice ggplot2R Graph GalleryR Shiny總結「The simple graph has brought more information to the data analyst』s mind than any other device.」 — John Tukey數據可視化在學術界和工業界都有廣泛的應用——除了許多論文里的實驗數據圖表外,企業的KPI報表、股市的K線圖、製造業的感測器數據監測、航空公司的上客監控,包括每年大家喜(ji)聞(si)樂(ren)見(le)的春運大數據,都是可視化的應用。數據可視化可以讓我們更直觀地從數據中獲取信息。

百度地圖春運出行儀錶盤(http://qianxi.baidu.com) - 2019五一假期出行

英國新聞巨頭BBC有一個數據新聞團隊(Data Journalism),專註於「從大量數據中發現值得注意的事實」。近期,該團隊分享了他們基於R開發的工具包bbplot,使大家能夠簡單方便地繪製出達到出版標準的圖表。專業化的繪圖工具正在被越來越多的行業所使用。本期博文,就讓我們了解一下R語言如何進行數據可視化。R 的繪圖系統R語言有兩大繪圖系統:基礎繪圖系統和Grid繪圖系統,兩者相互獨立。基礎繪圖系統直接在圖形設備上畫圖;而Grid系統將界面分成矩形區域(viewport),每個區域有自己獨立的坐標體系,並且相互可以嵌套,使得Grid系統可以畫出更複雜的圖形。用過R的朋友們知道,R的功能是通過一個個庫(package)——也就是我們常說的工具包實現的。基礎繪圖系統依賴於graphics包。基於Grid系統的包有grid,lattice,ggplot2等。grid包僅提供低級的繪圖功能(如點、線等),並不能畫出完整的圖形。更高級的圖形是兩個主流繪圖包lattice和ggplot2來實現。讓我們來關注最常用的三個包:graphics, lattice、ggplot2。graphics基礎繪圖包graphics,在安裝R時默認安裝,啟動R時默認載入。它囊括了常用的標準統計圖形,如條形圖,餅圖,直方圖,箱線圖,散點圖等。在R里運行:

demo(graphics)

會給出一些常用圖形的樣例(如下圖),及生成這些圖形的代碼。

lattice在使用之前,需要先載入lattice包。lattice包提供了大量新的繪圖類型、默認顏色、圖形排版等優化。同時,它還支持「條件多框圖」—— 如下圖,在不同月份(Month),觀察臭氧濃度(Ozone)與氣溫(Temp)之間的關係。這裡,「月份」就是我們所說的條件,條件多框圖可以讓我們更清楚地看到Ozone與Temp的關係是否受月份的影響而發生變化。

library(lattice)
xyplot(Temp ~ Ozone |factor(Month),
data = airquality,
main="Temp(F) vs Ozone(ppb) by Month",
layout=c(5,1))

ggplot2ggplot2由Hadley Wickham根據Grammar of Graphics(圖形的語法)中提出的理論而開發。它將繪圖視為一種映射,即從數學空間映射到圖形元素空間。它的繪圖方式類似於我們平時生活中畫圖,先創建一個畫布,然後一層層往上疊加信息。ggplot2是R中最常用到同時也是功能最強大的繪圖包(Python中也有了ggplot2的實現——plotnine,你只需要對R語言中的ggplot2代碼稍作修改,就能直接在Python中運行)。我們用ggplot2中自帶的數據diamonds為例來描述繪圖過程:繪製鑽石克拉數(carat)與價格(price)的關係,同時將純度(clarity)作為顏色變數。在代碼中,carat, price, clarity分別被映射到了x軸,軸y及color。

library(ggplot2)
ggplot(data=diamonds, mappings=aes(x=carat, y=price))+
geom_point(aes(color=clarity))

如果我們想在圖中增添統計變換,如兩變數關係的平滑曲線,僅需增加一行代碼

ggplot(data=diamonds, mappings=aes(x=carat, y=price))+
geom_point(aes(color=clarity))+stat_smooth()

同樣的,如果我們想分析在不同切工(cut)下克拉數與價格的關係(類似於lattice中的條件多框圖),也是一行代碼的工作量

ggplot(data=diamonds, mappings=aes(x=carat, y=price))+
geom_point(aes(color=clarity))+
stat_smooth()+facet_wrap(~cut)

ggplo2的基本概念有:
  • 數據(data)和映射(mapping)
  • 幾何對象(geometric)
  • 標度(scale)
  • 統計變換(statistics)
  • 坐標系統(coordinate)
  • 分面(facet)

使用ggplot2繪圖的過程就是選擇合適的幾何對象、圖形屬性、標度、統計變換、坐標系統和分面等來充分展現數據中所含有的信息的過程。ggplot2的強大之處就在於它的靈活性,通過不同圖層的疊加可以做出非常有意思的圖形。

R Graph Gallery除了上述提到的三個常用繪圖包,R還有很多其他圖形繪製的工具,如繪製3D圖形的plot3d,rgl,繪製地圖的ggmap,leaflet,互動式可視化plotly等等。在這裡,我們介紹一個神奇的網站 THE R GRAPH GALLERY (r-graph-gallery.com)。這個網站為我們提供了平時常用的8大類46種共計數146個(日期:2019-05-13)可視化樣例及代碼,及他們使用的工具包。

例如,點擊Sankey diagram(倒數第二行最後一個)的圖標,會進入如下的界面。可以看到NetworkD3這個包能用來繪製Sankey圖。

點擊圖形下的鏈接,網站會給出該圖形的詳細信息及實現的代碼

THE R GRAPH GALLERY 網站不僅提供各類統計圖形的R的實現方式,同時也在收錄相對應的Python的實現,是學習可視化非常好的資源。

R Shiny在我們的分析工作中,有時不僅要展示模型結果,還需要把分析歷程展示給聽眾;同時,聽眾也希望能夠參與到分析探索中來。這就需要我們將不同部分的分析 —— 如數據探索,模型構建及評估的過程整合到一起,同時增添可交互性。Shiny (shiny.rstudio.com/)是由RStudio開發的一個開源的 R 包,它為使用 R 構建 Web 應用提供了一個有力的 Web 框架。使用Shiny,我們可以用R語言輕鬆開發互動式web應用。在Shiny的官網上給出了一些App的應用案例:

我們通過官網上Kmeans example的例子(Demo)來看一看Shiny App的基本功能。這個例子中用的是R自帶的鳶尾花(iris)數據,用過R(或者Python)的朋友應該對這個數據非常熟悉。數據里包含了花萼長度(Sepal.Length),花萼寬度(Sepal.Width),花瓣長度(Pepal. Length),花瓣寬度(Pepal.Width)及花的品種(Species)信息。

在Demo中假設品種未知,通過其它變數將鳶尾花樣本分群。默認選項是將樣本按照Sepal.Length和 Sepal.Width分成3群。

通過Demo左側的工具欄,我們可以選擇不同的分群變數(Pepal. Length,Pepal.Width)及分群個數(2),來觀察不同的分群效果

實現這樣一個Shiny App的需要兩部分腳本:用戶交互(shinyUI)及伺服器(shinyServer)腳本。
  • shinyUI部分控制頁面的布置和展示。一方面,在這裡可以定義一系列的小工具,如滑動條(sliderInput),選項卡(radioButtons),輸入框(numericInput)等來接收用戶傳入的參數,儲存在input變數里。另一方面,它接收shinyServer傳來的output變數,並根據用戶的定義把它展示在前端。
  • shinyServer生成所要展示的結果。它從shinyUI讀取input變數,將其作為參數進行模型計算或圖形繪製,然後將結果儲存在output變數里,傳給shinyUI前端。

總結來說,shinyUI用於根據用戶的輸入生成input,同時展示output結果,shinyServer接收input參數,計算生成output。有興趣的朋友可以在Shiny的官網找到詳細的培訓教程。

總結

在本文,我們介紹了一些R的常用繪圖包以及學習資源:graphics通常用於快速基本的分析繪圖,個性化的圖形建議使用ggplot2來實現。R Graph Gallery從需求出發,歸納總結了各類圖形的使用案例。而Shiny整合前面的所有,生成可互動式的dashboard。這些都是工具,而作為數據科學家,我們要做的就是利用這些工具讓數據「說話」。

Reference

  1. BBC Visual and Data Journalism cookbook for R graphics bbc.github.io/rcookbook
  2. Paul Murrell(2011)R Graphics Second Edition
  3. ggplot2 Reference ggplot2.tidyverse.org/r
  4. THE R GRAPH GALLERY r-graph-gallery.com
  5. Shiny shiny.rstudio.com

推薦閱讀:

相关文章