上週在中國R語言大會北京會場上,給你們分享瞭如何利用R語言交互數據可視化。現場同窗對這塊內容很有興趣,故今天把一些經常使用的交互可視化的R包搬出來與你們分享。javascript
rCharts包html
提及R語言的交互包,第一個想到的應該就是rCharts包。該包直接在R中生成基於D3的Web界面。java
rCharts包的安裝git
require(devtools) install_github('rCharts', 'ramnathv')
rCharts函數就像lattice函數同樣,經過formula、data指定數據源和繪圖方式,並經過type指定圖表類型。github
下面經過例子來了解下其工做原理。咱們以鳶尾花數據集爲例,首先經過name函數對列名進行從新賦值(去掉單詞間的點),而後利用rPlot函數繪製散點圖(type=」point」),並利用顏色進行分組(color=」Species」)。瀏覽器
library(rCharts) names(iris) = gsub("\\.", "", names(iris)) p1 <- rPlot(SepalLength ~ SepalWidth | Species, data = iris, color = 'Species', type = 'point') p1
rCharts支持多個javascript圖表庫,每一個都有本身的長處。每個圖表庫有多個定製選項,其中大部分rCharts都支持。網絡
NVD3 是一個旨在創建可複用的圖表和組件的 d3.js 項目——它提供了一樣強大的功能,但更容易使用。它可讓咱們處理複雜的數據集來建立更高級的可視化。在rCharts包中提供了nPlot函數來實現。echarts
下面以眼睛和頭髮顏色的數據(HairEyeColor)爲例說明nPlot繪圖的基本原理。咱們按照眼睛的顏色進行分組(group=」eye」),對頭髮顏色人數繪製柱狀圖,並將類型設置爲柱狀圖組合方式(type=」multiBarChart」),這樣能夠實現分組和疊加效果。框架
library(rCharts) hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male") hair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1]) hair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2]) n1 <- nPlot(Freq ~ Hair, group = "Eye", data = hair_eye_male, type = "multiBarChart") n1
能夠經過圖形右上角選擇須要查看或隱藏的類別(默認是所有類別顯示的),也能經過左上角選擇柱子是按照分組仍是疊加的方式進行擺放(默認是分組方式)。若是選擇Stacked,就會繪製疊加柱狀圖。函數
Highcharts是一個製做圖表的純Javascript類庫,支持大部分的圖表類型:直線圖,曲線圖、區域圖、區域曲線圖、柱狀圖、餅狀圖、散佈圖等。在rCharts包中提供了hPlot函數來實現。
以MASS包中的學生調查數據集survery爲例,說明hPlot繪圖的基本原理。咱們繪製學生身高和每分鐘脈搏跳動次數的氣泡圖,以年齡變量做爲調整氣泡大小的變量。
library(rCharts) a <- hPlot(Pulse ~ Height, data = MASS::survey, type = "bubble", title = "Zoom demo", subtitle = "bubble chart", size = "Age", group = "Exer") a$colors('rgba(223, 83, 83, .5)', 'rgba(119, 152, 191, .5)', 'rgba(60, 179, 113, .5)') a$chart(zoomType = "xy") a$exporting(enabled = T) a
rCharts包能夠畫出更多漂亮的交互圖, http://ramnathv.github.io/rCharts/和https://github.com/ramnathv/rCharts/tree/master/demo有更多的例子可供你們學習。
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) install_github('yihui/recharts')
安裝完後,須要在https://github.com/madlogos/recharts/blob/master/R/echartR.R將echartR.R腳本下載到本地。
假如想對鳶尾花數據集繪製散點圖,能夠執行以下代碼:
source("~echartR.R") names(iris) = gsub("\\.", "", names(iris)) echartR(data=iris,x=~SepalLength,y=~PetalWidth,series = ~Species, type = 'scatter')
繪製柱狀圖:
hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male") hair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1]) hair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2]) echartR(data = hair_eye_male, x = Hair, y = ~Freq, series = ~Eye, type = 'bar', palette='fivethirtyeight', xlab = 'Hair', ylab = 'Freq')
玫瑰圖:
dtcars <- mtcars dtcars$car <- row.names(dtcars) dtcars$transmission <- as.factor(dtcars$am) levels(dtcars$transmission) <- c("Automatic","Manual") dtcars$cylinder <- as.factor(dtcars$cyl) dtcars$carburetor <-as.factor(dtcars$carb) echartR(dtcars, x = ~cylinder, y = ~car, type='rose', palette='colorblind', title='Number of Cylinders', subtitle = '(source: mtcars)')
雷達圖:
player <- data.frame(name=c(rep("Philipp Lahm",8),rep("Dani Alves",8)), para=rep(c("Passing%","Key passing","Comp crosses", "Crossing%","Successful dribbles", "Dispossessed","Dribbled past","Fouls"),2), value=c(89.67, 1.51, 0.97, 24.32, 0.83, 0.86, 1.15, 0.47, 86.62, 2.11, 0.99, 20.78, 1.58, 1.64, 0.9, 1.71)) echartR(player, x= ~para, y= ~value, series= ~name, type='radarfill', symbolList='none', palette=c('firebrick1','dodgerblue'), title='Lahm vs Alves', subtitle= '(by @mixedknuts)')
plotly包
接下來要給你們介紹的是另外一個功能強大的plotly包。它是一個基於瀏覽器的交互式圖表庫,它創建在開源的JavaScript圖表庫plotly.js之上。
有兩種安裝方式:
install.packages("plotly")
或者
devtools::install_github("ropensci/plotly")
plotly包利用函數plot_ly函數繪製交互圖。
若是相對鳶尾花數據集繪製散點圖,須要將mode參數設置爲」markers」。
library(plotly) p <- plot_ly(iris, x = Petal.Length, y = Petal.Width, color = Species, colors = "Set1", mode = "markers") p
若是想繪製交互箱線圖,須要將type參數設置爲box。
library(plotly) plot_ly(midwest, x = percollege, color = state, type = "box")
若是你已熟悉ggplot2的繪圖系統,也能夠針對ggplot2繪製的對象p,利用ggplotly函數實現交互效果。例如咱們想對ggplot繪製的密度圖實現交互效果,執行如下代碼便可。
library(plotly) p <- ggplot(data=lattice::singer,aes(x=height,fill=voice.part))+ geom_density()+ facet_grid(voice.part~.) (gg <- ggplotly(p))
其餘
此外還有不少好玩有用的交互包。例如專門用來畫交互時序圖的dygraphs包,可經過install.packages(「dygraphs」)安裝。
library(dygraphs) lungDeaths <- cbind(mdeaths, fdeaths) dygraph(lungDeaths) %>% dySeries("mdeaths", label = "Male") %>% dySeries("fdeaths", label = "Female") %>% dyOptions(stackedGraph = TRUE) %>% dyRangeSelector(height = 20)
DT包實現R數據對象能夠在HTML頁面中實現過濾、分頁、排序以及其餘許多功能。經過install.packages(「DT」)安裝。
以鳶尾花數據集iris爲例,執行如下代碼:
library(DT) datatable(iris)
networkD3包可實現D3 JavaScript的網絡圖,經過install.packages(「networkD3」)安裝。
下面是繪製一個力導向的網絡圖的例子。
# 加載數據 data(MisLinks) data(MisNodes) # 畫圖 forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source", Target = "target", Value = "value", NodeID = "name", Group = "group", opacity = 0.8)
devtools::install_github("timelyportfolio/d3treeR")
完成d3treeR包安裝。
library(treemap) library(d3treeR) data("GNI2014") tm <- treemap( GNI2014, index=c("continent", "iso3"), vSize="population", vColor="GNI", type="value" ) d3tree( tm,rootname = "World" )
今天主要是介紹了幾個R經常使用的交互包。在R的環境中,動態交互圖形的優點在於能和knitr、shiny等框架整合在一塊兒,能迅速創建一套可視化原型系統。但願之後再跟各位分享這部分的內容。