第十一章:中級繪圖
概要:每一種圖形都有他特定的使用場景。比如:第六章學習的圖形主要用於單類別型或連續型變數的分布情況;第八章的圖形適用於通過一系列預測變數來預測連續型結果變數的圖形;第九章的圖形用來展示連續型結果變數的組間差異。
本章的圖形用於展示雙變數和多變數之間的關係。我將從使用場景,代碼和圖形展示以及圖形含義來一一列舉本章的圖形。
一、散點圖
使用場景:之前的用來描述兩個連續型變數間的關係。本節,我們將添加額外信息來增強圖形表達效果。
1、添加最佳擬合曲線
attach(mtcars) nplot(wt, mpg, n main="Basic Scatterplot of MPG vs. Weight", n xlab="Car Weight (lbs/1000)", n ylab="Miles Per Gallon ", pch=19)nabline(lm(mpg ~ wt), col="red", lwd=2, lty=1) nlines(lowess(wt, mpg), col="blue", lwd=2, lty=2)ndetach(mtcars)n
此圖形添加了一條擬合直線和平滑曲線。通過兩條線,可以更加清晰直觀的表達出變數之間的關係。
下面圖形可以添加子集。
library(car) nscatterplot(mpg ~ wt | cyl, data=mtcars, lwd=2,n main="Scatter Plot of MPG vs. Weight by # Cylinders", n xlab="Weight of Car (lbs/1000)", n ylab="Miles Per Gallon", id.method="identify",n legend.plot=TRUE, labels=row.names(mtcars), n boxplots="xy")n
此圖形可以顯示出不同子集間變數的相關關係。相當於將三個前一副圖形合併在一起。旁邊的箱線圖用於展示兩變數。
2、散點圖矩陣
應用場景:在第一幅圖形中我們展示了如何展現兩變數之間的關係,但是如何展現四個變數之間的相互關係呢?一種方法是分別展現六副圖形,另一種做法是將六副圖形合併成一幅。這是接下來我們要講的。
pairs(~ mpg + disp + drat + wt, data=mtcars, n main="Basic Scatterplot Matrix")n
此圖形展示了四個變數兩兩間的相互關係。
接下來的代碼為上面的圖形添加了核密度曲線、軸須線和擬合直線。
library(car)nscatterplotMatrix(~ mpg + disp + drat + wt, data=mtcars,n spread=FALSE, smoother.args=list(lty=2),n main="Scatter Plot Matrix via car Package")n
如何將子集也添加到合併的圖形中,並用直方圖表示出來。
library(car)nscatterplotMatrix(~ mpg + disp + drat + wt|cyl, data=mtcars,n spread=FALSE, diagonal="histogram",n main="Scatter Plot Matrix via car Package")n
如何將散點圖矩陣中相關係更高的變數更靠近主對角線。
library(gclus)nmydata<-mtcars[c(1,3,5,6)]nmydata.corr<-abs(cor(mydata))nmycolors<-dmat.color(mydata.corr)nmyorder<-order.single(mydata.corr)ncpairs(mydata,n myorder,n panel.colors=mycolors,n gap=.5,n main="Scatter Plot Matrix via car Package")n
根據顏色,離主對角線越近的相關性越高。
3、高密度散點圖
散點圖的一個缺陷就是當數據點太多時,容易出現重疊部分,例如下面的代碼,它展示了10000個觀測點。
set.seed(1234)nn <- 10000nc1 <- matrix(rnorm(n, mean=0, sd=.5), ncol=2)nc2 <- matrix(rnorm(n, mean=3, sd=2), ncol=2)nmydata <- rbind(c1, c2)nmydata <- as.data.frame(mydata)nnames(mydata) <- c("x", "y")nnwith(mydata,n plot(x, y, pch=19, main="Scatter Plot with 10000 Observations"))n
此圖形模糊不清,但是高密度散點圖可以解決:
with(mydata,n smoothScatter(x, y, main="Scatter Plot colored by Smoothed Densities"))n
顏色越深,分布越密集。
還有一種圖形也可以解決此問題
library(hexbin)nwith(mydata, {n bin <- hexbin(x, y, xbins=50)n plot(bin, main="Hexagonal Binning with 10,000 Observations")n})n
可展現集中度的數字。
4、三維散點圖
前面使用散點圖展示的兩個變數之間的關係,接下來展現的是三個變數之間的交互關係。
那麼問題來了,什麼是交互關係?圖形怎麼看?
library(scatterplot3d)nattach(mtcars)nscatterplot3d(wt, disp, mpg,n main="Basic 3D Scatter Plot")n
還可以添加其他選項
scatterplot3d(wt, disp, mpg,n pch=16,n highlight.3d=TRUE,n type="h",n main="3D Scatter Plot with Vertical Lines")n
添加回歸面
s3d <-scatterplot3d(wt, disp, mpg,n pch=16,n highlight.3d=TRUE,n type="h",n main="3D Scatter Plot with Vertical Lines and Regression Plane")nfit <- lm(mpg ~ wt+disp)ns3d$plane3d(fit)ndetach(mtcars)n
點在平面之上說明他的預測值被低估了
三維散點圖看起來不容易理解,但使他旋轉起來理解起來會輕鬆些。
library(rgl)nattach(mtcars)nplot3d(wt, disp, mpg, col="red", size=5)n
三維散點圖我確實看不懂。
5、氣泡圖
氣泡圖想要達到的效果與三維散點圖類似。他是用點的大小來展示第三個變數的值。
attach(mtcars)nr <- sqrt(disp/pi)nsymbols(wt, mpg, circle=r, inches=0.30,n fg="white", bg="lightblue",n main="Bubble Plot with point size proportional to displacement",n ylab="Miles Per Gallon",n xlab="Weight of Car (lbs/1000)")ntext(wt, mpg, rownames(mtcars), cex=0.6)ndetach(mtcars)n
從圖中可以看出,隨著每加侖行駛里程的增加,車重和發動機排量都在逐漸減少。
試著用氣泡圖的理解方法去理解三維圖會容易理解些。
二、折線圖
將散點圖連起來就是折線圖
opar <- par(no.readonly=TRUE)npar(mfrow=c(1,2))nt1 <- subset(Orange, Tree==1)nplot(t1$age, t1$circumference,n xlab="Age (days)",n ylab="Circumference (mm)",n main="Orange Tree 1 Growth")nplot(t1$age, t1$circumference,n xlab="Age (days)",n ylab="Circumference (mm)",n main="Orange Tree 1 Growth",n type="b")npar(opar)n
複雜化的折線圖:比較5種橘樹隨時間推移生長狀況
#將因子轉化為數值型nOrange$Tree <- as.numeric(Orange$Tree)nntrees <- max(Orange$Tree)n#創建圖形nxrange <- range(Orange$age)nyrange <- range(Orange$circumference)nplot(xrange, yrange,n type="n",n xlab="Age (days)",n ylab="Circumference (mm)"n)ncolors <- rainbow(ntrees)nlinetype <- c(1:ntrees)nplotchar <- seq(18, 18+ntrees, 1)n#添加線條nfor (i in 1:ntrees) {n tree <- subset(Orange, Tree==i)n lines(tree$age, tree$circumference,n type="b",n lwd=2,n lty=linetype[i],n col=colors[i],n pch=plotchar[i]n )n}ntitle("Tree Growth", "example of line plot")n#添加圖例nlegend(xrange[1], yrange[2],n 1:ntrees,n cex=0.8,n col=colors,n pch=plotchar,n lty=linetype,n title="Tree"n) n
這幅圖很容易看懂,但製作相對不易。可用於比較不同變數之間的關係。
三、相關圖
相關圖用於解釋多變數之間的相關係數。
這與前面講到的散點圖矩陣有什麼區別?
好像是沒區別,只是變數增多了而已。
options(digits=2)ncor(mtcars)nnlibrary(corrgram)ncorrgram(mtcars, order=TRUE, lower.panel=panel.shade,n upper.panel=panel.pie, text.panel=panel.txt,n main="Corrgram of mtcars intercorrelations")n
此圖比較容易看懂,根據顏色和旋轉方向判斷即可。
使用置信區間和平滑擬合曲線
corrgram(mtcars, order=TRUE, lower.panel=panel.ellipse,n upper.panel=panel.pts, text.panel=panel.txt,n diag.panel=panel.minmax,n main="Corrgram of mtcars data using scatter plotsnand ellipses")n
此圖就不展示了,太混亂,不適用。
最後,再看一個圖
五、馬賽克圖
此圖用於多類別型變數的可視化。單類別型變數可用柱狀圖或者餅圖。
#方式一nftable(Titanic)nlibrary(vcd)nmosaic(Titanic, shade=TRUE, legend=TRUE)n#方式二nlibrary(vcd)nmosaic(~Class+Sex+Age+Survived, data=Titanic, shade=TRUE, legend=TRUE)n
兩種方式都可以實現上述圖形。
從此圖形可以看出大量隱含信息:1、從船頭到頭等艙,存活率徒然提高。(我沒看出來)2、大部分孩子都在二、三等艙。3、頭等艙大部分女性都存活下來,三等艙存活一半。4、船員中女性很少。還有其他信息有待挖掘。
小結:不同的變數類型,不同的變數數量,不同的展現方式使用不同的圖形。
推薦閱讀:
※有哪些 R 語言流行的包的功能是 Python 沒有對應的包的?
※R語言中S3,S4,RC結構都分別是什麼?
※用戶分析有哪些經典的模型和方法,如何系統的學慣用戶分析?
※Python 在數據分析工作中的地位與 R 語言、SAS、SPSS 比較如何?
※有哪些比較好的R語言網路視頻教程推薦?