
R語言數(shù)據(jù)可視化綜合指南
編譯|崔浩 校對|高航,姚佳靈
讓我們快速瀏覽一下這張圖表:
這張可視化數(shù)據(jù)圖(最初用Tableau軟件創(chuàng)建 )是如何利用數(shù)據(jù)可視化來幫助決策者的一個很好的例子。想象一下,如果這些信息通過表格來告訴投資者,你認為你會花多長時間來向他解釋?
如今的世界里,隨著數(shù)據(jù)量的不斷增長,很難不用可視化的形式來呈現(xiàn)你數(shù)據(jù)里的全部信息。雖然有專門的工具,如Tableau, QlikView 和 d3.js,但沒有任何東西能代替有很好可視化能力的建模/統(tǒng)計工具。尤其是它有助于做若干探索性數(shù)據(jù)分析和特征化工程。這就是R語言,它提供了令人難以置信的幫助。
R語言提供了令人滿意的一套內(nèi)置函數(shù)和庫(如 ggplot2, leaflet, lattice)用來建立可視化效果以呈現(xiàn)數(shù)據(jù)。在本文中,我已經(jīng)涉及了用R語言編程來創(chuàng)建既常見又先進的可視化效果的步驟。但是,在介紹那些之前,讓我們快速瀏覽一下數(shù)據(jù)可視化簡史。如果您對歷史不感興趣,沒問題,您可以跳到下一節(jié)。
從歷史來看,數(shù)據(jù)可視化的進化已經(jīng)被著名的從業(yè)者在工作中完成了。威廉.普萊菲(William Playfair)是統(tǒng)計圖形化方法的創(chuàng)始人。威廉.普萊菲發(fā)明了四種類型的圖表:線圖、經(jīng)濟學數(shù)據(jù)的柱狀圖、餅狀圖和圓圖。約瑟夫·普里斯特利(Joseph Priestly)創(chuàng)建了第一個劃時代的時間線圖,其中的每一個柱形是用來顯示一個人的壽命(1765)。沒錯,時間線圖被發(fā)明于250年前,而不是Facebook發(fā)明的!
最著名的早期可視化數(shù)據(jù)是由Charles Minard所描繪的Napoleon’s March(俄法戰(zhàn)爭)??梢暬瘮?shù)據(jù)中包含了隨著時間的變化,氣溫對拿破侖入侵俄國產(chǎn)生廣泛影響的信息。在圖形中,值得注意的是,在二個維度上的六種類型數(shù)據(jù),分別表示:拿破侖軍隊的數(shù)量,距離,溫度,緯度和經(jīng)度,行軍方向和跟特定日期有關的位置。
弗洛倫斯·南丁格爾(Florence Nightangle)也是數(shù)據(jù)可視化的先驅(qū)。她用數(shù)據(jù)圖表的方式描述了疾病對軍隊的死亡率的影響(1858)。瓊恩·雪諾(John Snow)(不是《權力的游戲》里的人物)是把地圖用在圖表和空間分析的先驅(qū)。在1854年的倫敦,用這地圖發(fā)現(xiàn)了霍亂疫情的源頭與公共水泵有關,信息圖幫助精確定位爆發(fā)源到某一個泵的位置。
用R語言進行數(shù)據(jù)可視化
在這篇文章中,我們將創(chuàng)建以下可視化效果:
基本可視化效果
1. 直方圖
2. 條形圖/線型圖
3. 箱式圖
4. 散點圖
高級可視化效果
1. 熱點圖
2. 影像鑲嵌圖
3. 地圖可視化
4. 3維圖
5. 相關圖
R語言 小竅門:
HistData軟件包提供了一個小數(shù)據(jù)集,它很有趣并且在統(tǒng)計和數(shù)據(jù)可視化的歷史上很重要。
基本可視化效果
便簽:
1.基本圖形可以很容易地用R語言進行創(chuàng)建。繪圖(plot)命令是要關注的命令。
2. 它的參數(shù)有x軸數(shù)據(jù)、y軸數(shù)據(jù)、x軸標簽、y軸標簽、顏色和標題。要創(chuàng)建線圖,只需簡單地使用參數(shù),類型選擇為l。
3. 如果你想要箱式圖,你可以選用箱式圖(boxplot),要條形圖就用條形圖函數(shù)。
1.直方圖
基本上,直方圖是將數(shù)據(jù)分解為一個個的小格子(或間隔),并顯示它們的頻率分布。您可以更改間隔,看看這樣做對數(shù)據(jù)可視化可理解性的影響。
給您舉個例子。
注意:我們使用的par(mfrow=c(2,5))命令,為的是清晰地把多個圖放在同一頁上(參看下面的代碼)。
library(RColorBrewer)
data(VADeaths)
par(mfrow=c(2,3))
hist(VADeaths,breaks=10, col=brewer.pal(3,"Set3"),main="Set3 3 colors")
hist(VADeaths,breaks=3 ,col=brewer.pal(3,"Set2"),main="Set2 3 colors")
hist(VADeaths,breaks=7, col=brewer.pal(3,"Set1"),main="Set1 3 colors")
hist(VADeaths,,breaks= 2, col=brewer.pal(8,"Set3"),main="Set3 8 colors")
hist(VADeaths,col=brewer.pal(8,"Greys"),main="Greys 8 colors")
hist(VADeaths,col=brewer.pal(8,"Greens"),main="Greens 8 colors")
請注意,如果間隔數(shù)少于被指定的顏色數(shù),顏色會變成極值,如上圖中的“Set3 8 colors”圖。如果間隔數(shù)目超過了顏色的數(shù)目,則顏色會開始像在第一行中一樣地重復出現(xiàn)。
2.條形圖/線型圖
線型圖
下面的折線圖顯示了在給定時間內(nèi)飛機乘客數(shù)的增長情況。折線圖通常是分析一段時間內(nèi)延伸趨勢的首選。此外,當我們需要比較數(shù)量隨著某種變量(例如時間)的相對變化時,線型圖也是適用的。下面是代碼:
plot(AirPassengers,type="l") #Simple Line Plot
條形圖適用于顯示跨幾個組別的累計匯總之間的比較。層疊圖用于跨類別的條形圖。下面是代碼:
barplot(iris$Petal.Length) #Creating simple Bar Graph
barplot(iris$Sepal.Length,col = brewer.pal(3,"Set1"))
barplot(table(iris$Species,iris$Sepal.Length),col = brewer.pal(3,"Set1")) #Stacked Plot
3. 箱式圖
箱式圖顯示5個有統(tǒng)計學意義的數(shù)字,分別是最小數(shù)、第一四分數(shù)位、中位數(shù)、第三四分位數(shù)和最大數(shù)。因此,它在數(shù)據(jù)延伸的可視化上非常有用,還能得出相應的推論。下面是簡單的代碼:
boxplot(iris$Petal.Length~iris$Species) #Creating Box Plot between two variable
讓我們來理解下面的代碼:
在下面的例子中,我在屏幕上顯示了4個圖。通過使用~符號,我可以將(萼片的長度)的伸展是如何跨各種類別(的物種)進行可視化。我在最后的兩個圖中演示了調(diào)色板。調(diào)色板是一組顏色,用來使圖標更有吸引力,而且能幫助在數(shù)據(jù)中創(chuàng)建醒目的區(qū)別。
data(iris)
par(mfrow=c(2,2))
boxplot(iris$Sepal.Length,col="red")
boxplot(iris$Sepal.Length~iris$Species,col="red")
oxplot(iris$Sepal.Length~iris$Species,col=heat.colors(3))
boxplot(iris$Sepal.Length~iris$Species,col=topo.colors(3))
要了解更多關于R語言中調(diào)色板的使用,請參看http://decisionstats.com/2011/04/21/using-color-palettes-in-r/
4. 散點圖(包括3D等功能)
散點圖有助于輕松地把數(shù)據(jù)可視化和進行簡單的數(shù)據(jù)檢查。這里有簡單散點圖和多元散點圖的代碼:
plot(x=iris$Petal.Length) #Simple Scatter Plot
plot(x=iris$Petal.Length,y=iris$Species) #Multivariate Scatter Plot
散點圖矩陣可以幫助將彼此交叉的多個變量可視化。
plot(iris,col=brewer.pal(3,"Set1"))
您可能會想,我還沒有把餅圖列表成基本圖形。這不是失誤,而是我故意這么做的。這是因為,數(shù)據(jù)可視化專業(yè)人員不贊成使用餅圖來表示數(shù)據(jù)。因為人的眼睛不能像目測線性距離那樣精確地目測出圓的距離。只需要簡單地把任何可用餅圖表示的東西都用線圖表示。但是,如果你喜歡餅圖,可使用:
pie(table(iris$Species))
到這里為止,我們已經(jīng)學過的所有圖表列表如下:
您可能已經(jīng)注意到,在一些圖表中,他們的標題已被截斷,因為我把太多圖表放在同一個屏幕上。要改變這一點,你只需要改變par函數(shù)的‘mfrow’參數(shù)。
高級可視化效果
什么是Hexbin Binning?
如果在同一個地方有很多點(overplotting),我們可以使用Hexbin包。六邊形面元劃分是一種二元直方圖,對大數(shù)量級結構的數(shù)據(jù)集的可視化非常有用。下面是代碼:
>library(hexbin)
>a=hexbin(diamonds$price,diamonds$carat,xbins=40)
>library(RColorBrewer)
>plot(a)
我們也可以創(chuàng)建一個調(diào)色板,然后用Hexbin繪圖功能以獲得更好的視覺效果。下面是代碼:
>library(RColorBrewer)
>rf <- colorRampPalette(rev(brewer.pal(40,'Set3')))
>hexbinplot(diamonds$price~diamonds$carat, data=diamonds, colramp=rf)
馬賽克拼圖
馬賽克拼圖可以通過數(shù)據(jù)所占據(jù)的面積大小來有效地顯示分類數(shù)據(jù)的相對比例。
> data(HairEyeColor)
> mosaicplot(HairEyeColor)
熱圖
熱圖使你能夠以兩個維度為軸,顏色的強度為第三個維度來進行探索性的數(shù)據(jù)分析。然而,你需要將數(shù)據(jù)集轉(zhuǎn)化成矩陣形式。下面是代碼:
> heatmap(as.matrix(mtcars))
您也可以使用image()命令做這種類型的可視化:
> image(as.matrix(b[2:7]))
如何匯總大量數(shù)據(jù)?
您可以使用tabplot包中的tableplot功能,快速匯總大量數(shù)據(jù)
地圖可視化
R語言中最新的東西是通過Javascript庫來進行數(shù)據(jù)可視化。Leaflet是JavaScript開源庫中最受歡迎的一個庫,用于互動地圖。有關它的內(nèi)容,請參考https://rstudio.github.io/leaflet/。
您可以用下面的代碼直接從github安裝Leaflet。
devtools::install_github("rstudio/leaflet")
制作上述地圖的代碼是非常簡單的:
library(magrittr)
library(leaflet)
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=77.2310, lat=28.6560, popup="The delicious food of chandni chowk")
m # Print the map
3維圖
用R語言的的功能讓人閃瞎眼的最簡單的方法之一是通過創(chuàng)建一張3維圖,而不需要用R語言寫一行代碼,并且在3分鐘內(nèi)就能完成。這樣要求是不是太過分呢?
我們使用R Commander包作為圖形用戶界面(GUI)。操作步驟如下:
1. 只需安裝Rcmdr包
2. 使用來自圖中的3D繪圖選項
下面的代碼不是用戶輸入的,是自動生成的。
便簽:當我們交換圖的坐標軸時,您應該看到有著相應代碼的圖,我們是如何使用xlab和ylab來傳遞軸標簽,圖標題用Main函數(shù),顏色是col參數(shù)。
>data(iris, package="datasets")
>scatter3d(Petal.Width~Petal.Length+Sepal.Length|Species, data=iris, fit="linear"
>residuals=TRUE, parallel=FALSE, bg="black", axis.scales=TRUE, grid=TRUE, ellipsoid=FALSE)
您還可以使用Lattice包來做3維圖。Lattice也可以用于xyplot。下面是代碼:
>attach(iris)# 3d scatterplot by factor level
>cloud(Sepal.Length~Sepal.Width*Petal.Length|Species, main="3D Scatterplot by Species")
>xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
相關圖(GUIs)
相關圖幫助我們把相關矩陣內(nèi)的數(shù)據(jù)可視化。下面是代碼:
> cor(iris[1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
> corrgram(iris)
R語言有三個主要的GUI包。RCcommander和KMggplot及Rattle用于數(shù)據(jù)
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結構數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結構數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結構數(shù)據(jù)特征價值的專業(yè)核心 表結構數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結構化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結構數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結構數(shù)據(jù)(以 “行 - 列” 存儲的結構化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結構數(shù)據(jù)價值的核心操盤手 表格結構數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10