利用R語言製作出14種漂亮的交互數據可視化
利用R語言也可以製作出漂亮的交互數據可視化,下面和大家分享一些常用的交互可視化的R包。
rCharts包
說起R語言的交互包,第一個想到的應該就是rCharts包。該包直接在R中生成基於D3的Web界面。
rCharts包的安裝:
require(devtools)ninstall_github(rCharts, ramnathv)n
rCharts函數就像lattice函數一樣,通過formula、data指定數據源和繪圖方式,並通過type指定圖表類型。
下面通過例子來了解下其工作原理。我們以鳶尾花數據集為例,首先通過name函數對列名進行重新賦值(去掉單詞間的點),然後利用rPlot函數繪製散點圖(type=」point」),並利用顏色進行分組(color=」Species」)。
library(rCharts)nnames(iris) = gsub(".", "", names(iris))np1 <- rPlot(SepalLength ~ SepalWidth | Species, data = iris, color = Species, type = point)np1n
rCharts支持多個javascript圖表庫,每個都有自己的長處。每一個圖表庫有多個定製選項,其中大部分rCharts都支持。
NVD3 是一個旨在建立可復用的圖表和組件的 d3.js 項目——它提供了同樣強大的功能,但更容易使用。它可以讓我們處理複雜的數據集來創建更高級的可視化。在rCharts包中提供了nPlot函數來實現。
下面以眼睛和頭髮顏色的數據(HairEyeColor)為例說明nPlot繪圖的基本原理。我們按照眼睛的顏色進行分組(group=」eye」),對頭髮顏色人數繪製柱狀圖,並將類型設置為柱狀圖組合方式(type=」multiBarChart」),這樣可以實現分組和疊加效果。
library(rCharts)nhair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male")nhair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1])nhair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2])nn1 <- nPlot(Freq ~ Hair, group = "Eye", data = hair_eye_male,ntype = "multiBarChart")nn1n
可以通過圖形右上角選擇需要查看或隱藏的類別(默認是全部類別顯示的),也能通過左上角選擇柱子是按照分組還是疊加的方式進行擺放(默認是分組方式)。如果選擇Stacked,就會繪製疊加柱狀圖。
Highcharts是一個製作圖表的純Javascript類庫,支持大部分的圖表類型:直線圖,曲線圖、區域圖、區域曲線圖、柱狀圖、餅狀圖、散布圖等。在rCharts包中提供了hPlot函數來實現。
以MASS包中的學生調查數據集survery為例,說明hPlot繪圖的基本原理。我們繪製學生身高和每分鐘脈搏跳動次數的氣泡圖,以年齡變數作為調整氣泡大小的變數。
library(rCharts)na <- hPlot(Pulse ~ Height, data = MASS::survey, type = "bubble",ntitle = "Zoom demo", subtitle = "bubble chart",nsize = "Age", group = "Exer")na$colors(rgba(223, 83, 83, .5), rgba(119, 152, 191, .5),nrgba(60, 179, 113, .5))na$chart(zoomType = "xy")na$exporting(enabled = T)nan
rCharts包可以畫出更多漂亮的交互圖, rCharts和ramnathv/rCharts有更多的例子可供大家學習。
recharts包
學習完rCharts包,可能有讀者會問,我們有沒有國人開發的包實現相似的效果呢?這邊給大家推薦一個同樣功能強大的recharts包。
本包來源於百度開發的國內頂尖水平的開源d3-js可視項目Echarts(Github Repo)。Yang Zhou和Taiyun Wei基於該工具開發了recharts包,經Yihui Xie修改後,可通過htmlwidgets傳遞js參數,大大簡化了開發難度。但此包開發仍未完成。為了趕緊上手用,基於該包做了一個函數echartR(下載至本地,以後通過source命令載入),用於製作基礎Echart交互圖。需要R版本>=3.2.0.
安裝方式如下:
library(devtools)ninstall_github(yihui/recharts)n
安裝完後,需要在https://github.com/madlogos/recharts/blob/master/R/echartR.R將echartR.R腳本下載到本地。
假如想對鳶尾花數據集繪製散點圖,可以執行如下代碼:
source("~echartR.R")nnames(iris) = gsub(".", "", names(iris))nechartR(data=iris,x=~SepalLength,y=~PetalWidth,series = ~Species,ntype = scatter)n
繪製柱狀圖:
hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male")nhair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1])nhair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2])nechartR(data = hair_eye_male, x = Hair, y = ~Freq, series = ~Eye,ntype = bar, palette=fivethirtyeight,nxlab = Hair, ylab = Freq)n
玫瑰圖:
dtcars <- mtcarsndtcars$car <- row.names(dtcars)ndtcars$transmission <- as.factor(dtcars$am)nlevels(dtcars$transmission) <- c("Automatic","Manual")ndtcars$cylinder <- as.factor(dtcars$cyl)ndtcars$carburetor <-as.factor(dtcars$carb)nechartR(dtcars, x = ~cylinder, y = ~car, type=rose,npalette=colorblind, title=Number of Cylinders,nsubtitle = (source: mtcars))n
雷達圖:
player <- data.frame(name=c(rep("Philipp Lahm",8),rep("Dani Alves",8)),npara=rep(c("Passing%","Key passing","Comp crosses",n"Crossing%","Successful dribbles",n"Dispossessed","Dribbled past","Fouls"),2),nvalue=c(89.67, 1.51, 0.97, 24.32, 0.83, 0.86, 1.15, 0.47,n86.62, 2.11, 0.99, 20.78, 1.58, 1.64, 0.9, 1.71))nechartR(player, x= ~para, y= ~value, series= ~name, type=radarfill,nsymbolList=none, palette=c(firebrick1,dodgerblue),ntitle=Lahm vs Alves, subtitle= (by @mixedknuts))n
plotly包
接下來要給大家介紹的是另一個功能強大的plotly包。它是一個基於瀏覽器的互動式圖表庫,它建立在開源的JavaScript圖表庫plotly.js之上。
有兩種安裝方式:
install.packages("plotly")n
或者
devtools::install_github("ropensci/plotly")n
plotly包利用函數plot_ly函數繪製交互圖。
如果相對鳶尾花數據集繪製散點圖,需要將mode參數設置為」markers」。
library(plotly)np <- plot_ly(iris, x = Petal.Length, y = Petal.Width,ncolor = Species, colors = "Set1", mode = "markers")npn
如果想繪製交互箱線圖,需要將type參數設置為box。
library(plotly)nplot_ly(midwest, x = percollege, color = state, type = "box")n
如果你已熟悉ggplot2的繪圖系統,也可以針對ggplot2繪製的對象p,利用ggplotly函數實現交互效果。例如我們想對ggplot繪製的密度圖實現交互效果,執行以下代碼即可:
library(plotly)np <- ggplot(data=lattice::singer,aes(x=height,fill=voice.part))+ngeom_density()+nfacet_grid(voice.part~.)n(gg <- ggplotly(p))n
其他
此外還有很多好玩有用的交互包。例如專門用來畫交互時序圖的dygraphs包,可通過install.packages(「dygraphs」)安裝。
library(dygraphs)nlungDeaths <- cbind(mdeaths, fdeaths)ndygraph(lungDeaths) %>%ndySeries("mdeaths", label = "Male") %>%ndySeries("fdeaths", label = "Female") %>%ndyOptions(stackedGraph = TRUE) %>%ndyRangeSelector(height = 20)n
DT包實現R數據對象可以在HTML頁面中實現過濾、分頁、排序以及其他許多功能。通過install.packages(「DT」)安裝。
以鳶尾花數據集iris為例,執行以下代碼:
library(DT)ndatatable(iris)n
networkD3包可實現D3 JavaScript的網路圖,通過install.packages(「networkD3」)安裝。
下面是繪製一個力導向的網路圖的例子。
# 載入數據ndata(MisLinks)ndata(MisNodes)nn# 畫圖nforceNetwork(Links = MisLinks, Nodes = MisNodes,nSource = "source", Target = "target",nValue = "value", NodeID = "name",nGroup = "group", opacity = 0.8)n
我們可以通過d3treeR包繪製交互treemap圖,利用
devtools::install_github("timelyportfolio/d3treeR")n
完成d3treeR包安裝。
library(treemap)nlibrary(d3treeR)ndata("GNI2014")ntm <- treemap(nGNI2014,nindex=c("continent", "iso3"),nvSize="population",nvColor="GNI",ntype="value"n)nd3tree( tm,rootname = "World" )n
本文主要是介紹了幾個R常用的交互包。在R的環境中,動態交互圖形的優勢在於能和knitr、shiny等框架整合在一起,能迅速建立一套可視化原型系統。
作者:謝佳標 數據分析與挖掘R語言十三式,打造R全棧專家 數據分析與挖掘R語言十三式,打造R全棧專家
大家也可以加小編微信:tswenqu,進R語言中文社區 交流群。
推薦閱讀:
※另一版的「知乎答案的時間段分布」
※Gartner 2016年商業智能與分析平台魔力象限
※數據可視化基礎——數據模型
※R語言可視化學習筆記之ggpubr包
※R-ggridges包的改進