本章內容
條形圖、箱線圖和點圖
餅圖和扇形圖
直方圖與核密度圖
</br>
6.1條形圖(Simple Bar Plot簡單條形圖)(Horizontal Bar Plot水平條形圖)
條形圖通過垂直的或水平的條形展示了類別型變量的分布(頻數)。
使用barplot()函數:barplot(height)。其中的height是一個向量或一個矩陣。
01簡單條形圖(height 是一個向量時)
示例如下:
>install.packages("vcd")#安裝vcd包
> library(vcd)#載入包
> counts<-table(Arthritis$Improved)#提取樣本中改善的量
> counts#輸出結果
None Some Marked
42 14 28
>
> barplot(counts,
+ main = "Simple Bar Plot",
+ xlab = "Improvement",ylab = "Frequency")#繪制簡單條形圖
> barplot(counts,
+ main = "Horizontal Bar Plot",
+ xlab = "Frequency",ylab = "Improvement", col = c("red","yellow","green"),
+ horiz = TRUE)#繪制水平條形圖,horiz = TRUE表示水平繪制,使用col添加顏色
02堆砌條形圖和分組條形圖(height 是一個矩陣時)
> library(vcd)
> counts<-table(Arthritis$Improved,Arthritis$Treatment)#選取治療類型和改善情況
> counts#輸出結果
Placebo Treated
None 29 13
Some 7 7
Marked 7 21
>
> barplot(counts,
+ main = "Stacked Bar Plot",
+ xlab = "Treatment",ylab = "Frequency",
+ col = c("red","yellow","green"),
+ legend=rownames(counts))#繪制堆砌條形圖
> barplot(counts,
+ main = "Grouped Bar Plot",
+ xlab = "Treatment",ylab = "Frequency",
+ col = c("red","yellow","green"),
+ legend=rownames(counts),beside = TRUE)#繪制分組條形圖
參數legend.text為圖例提供了各條形的標簽(僅在height為一個矩陣時有用)。
beside=FALSE(默認值),若beside=TRUE,則矩陣中的每一列都表示一個分組,各列中的值將并列而不是堆砌。
由于標簽和圖形重疊,影響美觀和觀測,所以回看第三章相關內容,改進如下:
legend("topright",legend=c("None","Some","Marked"),fill=c("red","yellow","green"))
但是效果還不是很理想。
03均值條形圖
條形圖并不一定要基于計數數據或頻率數據。你可以使用數據整合函數并將結果傳遞給barplot() 函數,來創建表示均值、中位數、標準差等的條形圖。
> options(digits = 3)
> states<-data.frame(state.region,state.x77)
> means<-aggregate(states$Illiteracy,by=list(state.region),FUN=mean)
> means
Group.1 x
1 Northeast 1.00
2 South 1.74
3 North Central 0.70
4 West 1.02
>
> means<-means[order(means$x),]#將均值從小到大進行排序
> means
Group.1 x
3 North Central 0.70
1 Northeast 1.00
4 West 1.02
2 South 1.74
>
> barplot(means$x,names.arg = means$Group.1)
> title("Mean Illiteracy Rate")#添加標題
>#缺失一個標簽,不知道為何?
lines(means$x,type = "b",pch=17,lty=2,col="red")#加入代碼添加線條
04條形圖的微調
有若干種方式可以微調條形圖的外觀。使用參數cex.names來減小字號。將其指定為小于1的值可以縮小標簽的大小。可選的參數names.arg允許你指定一個字符向量作為條形的標簽名。你同樣可以使用圖形參數輔助調整文本間隔。
> par(mar=c(5,8,4,2))#增加y邊界的大小
> par(las=2)#旋轉條形的標簽
> counts<-table(Arthritis$Improved)
> barplot(counts,main = "Treatment Outcome",
+ horiz = TRUE,
+ cex.names = 0.8,#縮小字體,讓標簽更合適
+ names.arg = c("No Improvement","Some Improvement",
+ "Markde Improvement"))#修改標簽文本
05 棘狀圖
> library(vcd)
> attach(Arthritis)
The following object is masked _by_ .GlobalEnv:
ID
> counts <- table(Treatment, Improved)
> spine(counts, main="Spinogram Example")
> detach(Arthritis)
>
6.2餅圖
餅圖可由以下函數創建:pie(x,labels)
其中x是一個非負數值向量,表示每個扇形的面積,而labels則是表示各扇形標簽的字符型向量。
> par(mfrow=c(2,2))#四個圖形為作為一組
> slices<-c(10,12,4,16,8)#餅圖每一個片區的值,即扇形面積
> lbls<-c("US","UK","Australia","Germany","France")#國家名稱,扇區的字符型向量
> #輸出餅圖
> pie(slices,labels = lbls,main = "Simple Pie Chart")
>
>
> pct<-round(slices/sum(slices)*100)#將面積數據轉換為比例值
> lbls2<-paste(lbls," ",pct,"%",sep = "")#標簽內容
> #有5種顏色的餅圖
> pie(slices,labels = lbls2,col = rainbow(length(lbls2)),
+ main = "Pie Chart with Percentages")
> #生成3D餅圖
> library(plotrix)
> pie3D(slices,labels=lbls,explode=0.1,
+ main="3D Pie Chat ")
> #從表格創建餅圖
> mytable<-table(state.region)
> lbls3<-paste(names(mytable),"\n",mytable,sep = "")
> pie(mytable,labels = lbls3,
+ main = "Pie Chart from a Table\n (with sample sizes)")
>
在R中,扇形圖是通過plotrix包中的fan.plot()函數實現的。
> library(plotrix)
> slices<-c(10,12,4,16,8)
> lbls<-c("US","UK","Australia","Germany","France")#國家名稱,扇區的字符型向量
> fan.plot(slices,labels = lbls,main = "Fan Plot")
6.3直方圖
使用如下函數創建直方圖:hist(x),其中的x是一個由數據值組成的數值向量。參數freq=FALSE表示根據概率密度而不是頻數繪制圖形。參數breaks用于控制組的數量。在定義直方圖中的單元時,默認將生成等距切分。
> par(mfrow=c(2,2))#定義圖形位置
> hist(mtcars$mpg)#繪制簡單直方圖,未指定任何參數,默認圖形
> #繪制信息清晰的直方圖,添加標簽、標題、顏色
> hist(mtcars$mpg,
+ breaks = 12,#指定為12組
+ col = "red",
+ xlab = "Miles Per Gallon",
+ main = "Colored histogram with 12 bins")
>
> hist(mtcars$mpg,
+ freq = FALSE,#根據概率密度而不是頻數繪制圖形
+ breaks = 12,
+ col="red",
+ xlab = "Miles Per Gallon",
+ main = "Histogram,rug plot,density curve")
> rug(jitter(mtcars$mpg))#添加軸須圖
> lines(density(mtcars$mpg),col="blue",lwd=2)#疊加藍色雙倍默認線條寬度的曲線
> #繪制帶有正態曲線和盒型的直方圖
> x<-mtcars$mpg
> h<-hist(x,
+ breaks = 12,
+ col = "red",
+ xlab = "Miles Per Gallon",
+ main = "Histogram with normal curve and box")
> xfit<-seq(min(x),max(x),length=40)
> yfit<-dnorm(xfit,mean = mean(x),sd=sd(x))
> yfit<-yfit*diff(h$mids[1:2])*length(x)
> lines(xfit,yfit,col="blue",lwd=2)
> box()
6.4核密度圖
繪制密度圖的方法(不疊加到另一幅圖上方)為:plot(density(x))
其中的x是一個數值型向量。由于plot()函數會創建一幅新的圖形,所以要向一幅已經存在的圖形上疊加一條密度曲線,可以使用lines()函數。
> #繪制核密度圖
> par(mfrow=c(2,1))
> d<-density(mtcars$mpg)
> plot(d)#繪制默認設置的最簡圖形
>
> d<-density(mtcars$mpg)#密度函數
> plot(d,main = "Kernel Density of Miles Per Gallon")#添加一個標題
> polygon(d,col = "red",border = "blue")#將曲線修改為藍色,并使用實心紅色填充曲線下方的區域
> rug(mtcars$mpg,col = "brown")#添加棕色的軸須圖
> library(sm)
> attach(mtcars)
> #創建分組因子。
> cyl.f<-factor(cyl,levels = c(4,6,8),
+ labels = c("4 cylinder","6 cylinder",
+ "8 cylinder"))#變量 cyl 是一個以4、6或8編碼的數值型變量。
> #為了向圖形提供值的標簽,這里 cyl 轉換為名為 cyl.f 的因子。
>
> sm.density.compare(mpg,cyl,xlab="Miles Per Gallon")#繪制密度圖
> title(main = "MPG Distribution by Car Cylinders")#添加標題
>
> colfill<-c(2:(1+length(levels(cyl.f))))#創建一個顏色向量
> legend(locator(1),levels(cyl.f),fill=colfill)
6.5箱線圖
箱線圖(又稱盒須圖)通過繪制連續型變量的五數總括,即最小值、下四分位數(第25百分位數)、中位數(第50百分位數)、上四分位數(第75百分位數)以及最大值,描述了連續型變量的分布。箱線圖能夠顯示出可能為離群點(范圍±1.5*IQR以外的值,IQR表示四分位距,即上四分位數與下四分位數的差值)的觀測。
> #生成箱線圖
> boxplot(mtcars$mpg,main="Box plot",ylab="Miles per Gallon")
> boxplot.stats(mtcars$mpg)
$stats
[1] 10.40 15.35 19.20 22.80 33.90
$n
[1] 32
$conf
[1] 17.11916 21.28084
$out
numeric(0)
01使用并列箱線圖進行跨組比較
箱線圖可以展示單個變量或分組變量。使用格式為:oxplot(formula,data=dataframe)
其中的formula是一個公式,dataframe代表提供數據的數據框(或列表)。
一個示例公式為yA,這將為類別型變量A的每個值并列地生成數值型變量y的箱線圖。公式yA*B則將為類別型變量A和B所有水平的兩兩組合生成數值型變量y的箱線圖。添加參數varwidth=TRUE將使箱線圖的寬度與其樣本大小的平方根成正比。參數horizontal=TRUE可以反轉坐標軸的方向。
#為每個氣缸生成每加侖行駛的英里數箱線圖
> boxplot(mpg~cyl,data = mtcars,
+ main="Car Mileage Data",
+ xlab="Number of Cylinders",
+ ylab="Miles per Gallom")
> #添加notch=TRUE生成含凹槽的箱線圖
> boxplot(mpg~cyl,data = mtcars,
+ notch=TRUE,
+ varwidth=TRUE,
+ col="red",
+ main="Car Mileage Data",
+ xlab="Number of Cylinders",
+ ylab="Miles Per Gallon")
Warning message:
In bxp(list(stats = c(21.4, 22.8, 26, 30.4, 33.9, 17.8, 18.65, 19.7, :
一些槽在折葉點外('box'): 可能是因為notch=FALSE
#兩個交叉因子的箱線圖
> #創建氣缸數量因子
> mtcars$cyl.f<-factor(mtcars$cyl,
+ levels = c(4,6,8),
+ labels = c("4","6","8"))
> #創建變速箱類型因子
> mtcars$am.f<-factor(mtcars$am,
+ levels = c(0,1),
+ labels = c("auto","standard"))
> #繪制箱線圖,為變速箱和氣缸數所有水平的兩兩組合生成每加侖行駛英里數
> boxplot(mpg~am.f*cyl.f,
+ data = mtcars,
+ col=c("gold","darkgreen"),
+ main="MPG Distribution by Atuo Type",
+ xlab="Atuo Type",
+ ylab="Miles Per Gallon")
從圖中可以看到不同組間油耗的區別非常明顯。同時也可以發現,六缸車型的每加侖汽油行駛的英里數分布較其他兩類車型更為均勻。與六缸和八缸車型相比,四缸車型的每加侖汽油行駛的英里數散布最廣(且正偏)。在八缸組還有一個離群點。
</br>
02小提琴圖
使用vioplot包中的vioplot()函數繪制它。請在第一次使用之前安裝vioplot包。
vioplot()函數的使用格式為:vioplot(x1,x2,...,names=,col=)
其中x1,x2,...表示要繪制的一個或多個數值向量(將為每個向量繪制一幅小提琴圖)。參數names是小提琴圖中標簽的字符向量,而col是一個為每幅小提琴圖指定顏色的向量。
> install.packages("vioplot")
> library(vioplot)
Warning message:
程輯包‘vioplot’是用R版本3.3.3 來建造的
> x1<-mtcars$mpg[mtcars$cyl==4]
> x2<-mtcars$mpg[mtcars$cyl==6]
> x3<-mtcars$mpg[mtcars$cyl==8]
> vioplot(x1,x2,x3,
+ names = c("4 cyl","6 cyl","8 cyl"),
+ col = "gold")
>
> title("Violin Plots of Miles Per Gallon",
+ ylab = "Miles Per Gallon",
+ xlab = "Number of Cylinders")
(小提琴圖真的很漂亮)
在圖中,白點是中位數,黑色盒型的范圍是下四分位點到上四分位點,細黑線表示須。外部形狀即為核密度估計。
</br>
6.6點圖
點圖提供了一種在簡單水平刻度上繪制大量有標簽值的方法。
你可以使用dotchart()函數創建點圖,格式為:dotchart(x,labels=)其中的x是一個數值向量,而labels則是由每個點的標簽組成的向量。你可以通過添加參數groups來選定一個因子,用以指定x中元素的分組方式。如果這樣做,則參數gcolor可以控制不同組標簽的顏色,cex可以控制標簽的大小。
> #每種車型每加侖汽油行駛英里數的點圖(散亂的,難以分析的)
> dotchart(mtcars$mpg,labels = row.names(mtcars),
+ cex = .7,
+ main = "Gas Mileage for Car Models",
+ xlab = "Miles Per Gallon")
> #各車型依汽缸數量分組的每加侖汽油行駛英里數點圖,分組排序后的點圖
> #根據每加侖汽油行駛英里數(從最低到最高)
> #對數據框 mtcars 進行排序,結果保存為數據框 x
> x<-mtcars[order(mtcars$mpg),]
> #將數值向量 cyl 轉換為一個因子
> x$cyl<-factor(x$cyl)
> #添加一個字符型向量 ( color )到數
> #據框 x 中,根據 cyl 的值,它所含的值
> #為 "red" 、 "blue" 或 "darkgreen"
> x$color[x$cyl==4]<-"red"
> x$color[x$cyl==6]<-"blue"
> x$color[x$cyl==8]<-"darkgreen"
> dotchart(x$mpg,
+ labels=row.names(x),#各數據點的標簽取自數據框的行名
+ cex=.7,
+ groups=x$cyl,#數據點根據汽缸數量分組
+ gcolor="black",#數字4、6、8顯示為黑色
+ color=x$color,#點和標簽的顏色
+ pch=19,
+ main="Gas Mileage for Car Models\ngrouped by cylinder",
+ xlab="Mlies Per Gallon")
從圖中可以看到,隨著汽缸數的減少,每加侖汽油行駛的英里數有了增加。但也有例外。例如,Pontiac Firebird有8個汽缸,但較六缸的Mercury280C和Valiant的行駛英里數更多。六缸的Hornet 4 Drive與四缸的Volvo 142E的每加侖汽油行駛英里數相同。同樣明顯的是,Toyota Corolla的油耗最低,而Lincoln Continental和Cadillac Fleetwood是英里數較低一端的離群點。
</br>
本章小結
- 學會了使用條形圖和餅圖了解類別型變量的分布,以及通過堆砌條形圖和分組條形圖理解不同類別型輸出的組間差異。
- 探索了直方圖、核密度圖、箱線圖、軸須圖以及點圖可視化連續型變量分布的方式。
- 了解了密度圖、并列箱線圖和分組點圖可視化連續型輸出變量組間差異的方法。
對單個變量(數值型變量和類別型變量)的可視化方法有了一定的認識和掌握,通過各種常用圖形的繪制,加深了理解單個變量的分布和意義,有利于后續多變量統計方法的學習。
重點是熟悉并掌握各類圖形的應用場景、使用函數,以及相關的繪圖函數應用。