R語言第六章——基本圖形(多圖)

本章內容

條形圖、箱線圖和點圖
餅圖和扇形圖
直方圖與核密度圖

</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>

本章小結

  1. 學會了使用條形圖和餅圖了解類別型變量的分布,以及通過堆砌條形圖和分組條形圖理解不同類別型輸出的組間差異。
  2. 探索了直方圖、核密度圖、箱線圖、軸須圖以及點圖可視化連續型變量分布的方式。
  3. 了解了密度圖、并列箱線圖和分組點圖可視化連續型輸出變量組間差異的方法。

對單個變量(數值型變量和類別型變量)的可視化方法有了一定的認識和掌握,通過各種常用圖形的繪制,加深了理解單個變量的分布和意義,有利于后續多變量統計方法的學習。
重點是熟悉并掌握各類圖形的應用場景、使用函數,以及相關的繪圖函數應用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容