1 散點圖
散點圖可用來描述兩個連續型變量間的關系。R中創建散點圖的基礎函數是plot(x, y),其中,x和y是數值型向量,代表着圖形中的(x, y)點。下面展示了一個例子。
attach(mtcars)
plot(wt, mpg, main="Basic Scatter plot of MPG vs. Weight", xlab="Car Weight (lbs/1000)",
ylab="Miles Per Gallon ", pch=19)
abline(lm(mpg~wt), col="red", lwd=2, lty=1)
lines(lowess(wt,mpg), col="blue", lwd=2, lty=2)
結果分析:使用的是mtcars數據框,創建了一幅基本的散點圖,wt和mpg之間的關系是用實心圓圈來表示的,abline()函數用來添加最佳擬合的線性直線,如圖中紅色實線所示,lowess()函數則用來添加一條平滑曲線,如圖中藍色虛線所示。結果表示,隨着車重的增加,每加侖英里數減少。
1.1 散點圖矩陣
R中有很多創建散點圖矩陣的實用函數。pairs()函數可以創建基礎的散點圖矩陣,下面的代碼生成了一個散點圖矩陣,包含mpg、disp、drat和wt四個變量:
pairs(~mpg+disp+drat+wt, data=mtcars, main="Basic Scatter Plot Matrix")
結果分析:看到所有指定變量間的二元關系,主對角線的上方和下方的六幅散點圖是相同的,可以發現是關於主對角線對稱。
通過調整參數,可以只展示下三角或者上三角的圖形。例如,選項upper.panel = NULL將只生成下三角的圖形。
pairs(~mpg+disp+drat+wt, data=mtcars, main="Basic Scatter Plot Matrix",upper.panel = NULL)
car包中的scatterplotMatrix()函數也可以生成散點圖矩陣:
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt, data=mtcars, spread=FALSE, smoother.args=list(lty=2),
main="Scatter Plot Matrix via car Package")
結果分析:可以看到線性和平滑(loess)擬合曲線被默認添加,主對角線處添加了核密度曲線和軸須圖。spread = FALSE選項表示不添加展示分散度和對稱信息的直線,smoother.args=list(lty=2)設定平滑(loess)擬合曲線使用虛線而不是實線。
1.2 高密度散點圖
當數據點重疊很嚴重時,用散點圖來觀察變量關系非常不明顯,下面構造10 000個觀測點,顯示它們分布在兩個重疊的數據群中的情況:
set.seed(1234)
n <- 10000
c1 <- matrix(rnorm(n, mean=0, sd=.5), ncol=2)
c2 <- matrix(rnorm(n, mean=3, sd=2), ncol=2)
mydata <- rbind(c1, c2)
mydata <- as.data.frame(mydata)
names(mydata) <- c("x", "y")
with(mydata, plot(x, y, pch=19, main="Scatter Plot with 10,000 Observations"))
10 000個觀測點的散點圖,嚴重的重疊導致很難識別哪里數據點的密度最大,數據點的重疊導致識別x與y間的關系變得異常困難,R提供了一些解決辦法。你可以使用封箱、顏色和透明度來指明圖中任意點上重疊點的數目。smoothScatter()函數可利用核密度估計生成用顏色密度來表示點分布的散點圖:
with(mydata, smoothScatter(x, y, main="Scatter Plot Colored by Smoothed Densities"))
結果分析:途中藍色點最大的一塊區域表示x與y之間的密度最大。
hexbin包中的hexbin()函數將二元變量的封箱放到六邊形單元格中(圖形比名稱更直觀)。示例如下:
install.packages("hexbin")
library(hexbin)
with(mydata, { bin <- hexbin(x, y, xbins=50)
plot(bin, main="Hexagonal Binning with 10,000 Observations") })
x, y:向量,給出要分層的二元數據點的坐標。
xbins:划分xbnds范圍的bins數量。
結果分析:用六邊形封箱圖展示的各點上覆蓋觀測點數目的散點圖,通過圖例,數據的集中度很容易計算和觀察。
1.3 三維散點圖
散點圖和散點圖矩陣展示的都是二元變量關系,那么我們想一次對三個定量變量的交互關系進行可視化呢?本節例子中,你可以使用三維散點圖。
例如,假使你對汽車英里數、車重和排量間的關系感興趣,可用scatterplot3d包中的
scatterplot3d()函數來繪制它們的關系。格式如下:
scatterplot3d(x, y, z)
x被繪制在水平軸上,y被繪制在豎直軸上,z被繪制在透視軸上。
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, main="Basic 3D Scatter Plot")
結果分析:該三維圖顯示了每加侖英里數mpg、車重wt和排量disp的三維散點圖
satterplot3d()函數提供了許多選項,包括設置圖形符號、軸、顏色、線條、網格線、突出顯示和角度等功能。例如代碼:
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h",
main="3D Scatter Plot with Vertical Lines")
type:表示繪圖類型的字符:"p "表示點,"l "表示線,"h "表示垂直於x-y平面的線
我們還可以在剛才那幅圖上添加一個回歸面,代碼如下:
library(scatterplot3d)
attach(mtcars)
s3d <-scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h",
main="3D Scatter Plot with Vertical Lines and Regression Plane")
fit <- lm(mpg ~ wt+disp)
s3d$plane3d(fit)
結果分析:平面代表預測值,圖中的點是實際值。平面到點的垂直距離表示殘差值。若點在平面之上則表明它的預測值被低估了,而點在平面之下則表明它的預測值被高估了。
1.4 旋轉三維散點圖
如果你能對三維散點圖進行交互式操作,那么圖形將會更好解釋。R提供了一些旋轉圖形的
功能,讓你可以從多個角度觀測繪制的數據點。
例如,你可用rgl包中的plot3d()函數創建可交互的三維散點圖。你能通過鼠標對圖形進行旋轉。函數格式為:
plot3d(x, y, z)
其中x、y和z是數值型向量,代表着各個點,還可以添加如col和size這類的選項來分別控制點的顏色和大小,下面是一個例子:
install.packages("rgl")
library(rgl)
attach(mtcars)
plot3d(wt, disp, mpg, col="red", size=5)
也可以使用car包中類似的函數scatter3d():
library(car)
with(mtcars, scatter3d(wt, disp, mpg))
1.5氣泡圖
我們通過三維散點圖來展示三個定量變量間的關系。現在介紹另外一種思路:先創建一個二維散點圖,然后用點的大小來代表第三個變量的值。這便是氣泡圖(bubble plot)。
symbols()函數來創建氣泡圖。該函數可以在指定的(x, y)坐標上繪制圓圈圖、方形圖、星形圖、溫度計圖和箱線圖。以繪制圓圈圖為例:
symbols(x, y, circle=radius)
其中x、y和radius是需要設定的向量,分別表示x、y坐標和圓圈半徑,z即第三個要繪制的變量。
x軸代表車重wt,y軸代表每加侖英里數mpg,氣泡大小代表發動機排量disp。代碼如下:
attach(mtcars)
r <- sqrt(disp/pi)
symbols(wt, mpg, circle=r, inches=0.30,
fg="white", bg="lightblue",
main="Bubble Plot with point size proportional to displacement",
ylab="Miles Per Gallon",
xlab="Weight of Car (lbs/1000)")
text(wt, mpg, rownames(mtcars), cex=0.6)
detach(mtcars)
結果分析:選項inches是比例因子,控制着圓圈大小(默認最大圓圈為1英寸)。text()函數是可選函數,此處用來添加各個汽車的名稱。從圖中可以看到,隨着每加侖汽油所行駛里程的增加,車重和發動機排量都逐漸減少。