中級繪圖--散點圖(散點圖矩陣、高密度散點圖、(旋轉)三維散點圖、氣泡圖)


1 散點圖

散點圖可用來描述兩個連續型變量間的關系。R中創建散點圖的基礎函數是plot(x, y),其中,xy是數值型向量,代表着圖形中的(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()函數可以創建基礎的散點圖矩陣,下面的代碼生成了一個散點圖矩陣,包含mpgdispdratwt四個變量:

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個觀測點的散點圖,嚴重的重疊導致很難識別哪里數據點的密度最大,數據點的重疊導致識別xy間的關系變得異常困難,R提供了一些解決辦法。你可以使用封箱、顏色和透明度來指明圖中任意點上重疊點的數目。smoothScatter()函數可利用核密度估計生成用顏色密度來表示點分布的散點圖:

with(mydata, smoothScatter(x, y, main="Scatter Plot Colored by Smoothed Densities"))

 

結果分析:途中藍色點最大的一塊區域表示xy之間的密度最大。

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)

其中xyz是數值型向量,代表着各個點,還可以添加如colsize這類的選項來分別控制點的顏色和大小,下面是一個例子:

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)

其中xyradius是需要設定的向量,分別表示xy坐標和圓圈半徑,z即第三個要繪制的變量。

x軸代表車重wty軸代表每加侖英里數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()函數是可選函數,此處用來添加各個汽車的名稱。從圖中可以看到,隨着每加侖汽油所行駛里程的增加,車重和發動機排量都逐漸減少。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM