由ggplot繪制成的散點圖、箱狀圖等十分美觀,在不少SCI論文中都可以看到它的身影。然而,在涉及到多變量大數據的時候,一行行輸入R代碼去一個個的繪圖不免效率低下。本篇文章將介紹如何使用ggplot批量繪制圖形。本篇教程以R自帶的數據集 – iris鳶尾花數據 – 為例,將問題簡單化為 - 以iris數據集中的前3個變量為自變量,第4個變量Petal.Width為因變量,用ggplot批量繪制散點圖,并用簡單線性回歸擬合。各位讀者們可以根據自身需要,對所展示的代碼進行更改、深化。
涉及到的知識點如下:
1.iris鳶尾花數據集的簡單介紹
2.assign ()和get () 聯合使用,存儲及調用橫/縱坐標的名稱
3.for 循環中調用ggplot,實現批量繪圖
一. iris鳶尾花數據集的簡單介紹:
1. 首先,讓我們大致看一下iris鳶尾花數據集中的內容
head(iris) #用head()語句調用一下iris數據集的前幾行數據,得到結果如下:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
可以發現,iris數據集中有5個變量,前4個變量為數值型(numeric),最后一個為字符型 (character)。
2. 其次,我們定義一下iris數據集中的4個數值型變量的英文縮寫以及單位 (不一定符合實際)
變量 | 縮寫 | 單位 |
---|---|---|
Sepal.Length | SL | mm |
Sepal.Width | SW | mm |
Petal.Length | PL | mm |
Petal.Width | PW | mm |
二. assign()和get()聯合使用,存儲/調用橫縱坐標名稱:
aasign()就是給變量賦值。此語句的詳細解釋,見https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/assign
Labels<-NULL
for (j in 1:1:4){
Labels[j] <- paste("Labels", j, sep = "")
assign(Labels[j], NULL)
} #使用for循環,循環定義4個變量 - Labels1, Labels2, Labels3, Labels4
assign(Labels[1], expression(italic(SL)~"("*"mm"*")"))
assign(Labels[2], expression(italic(SW)~"("*"mm"*")"))
assign(Labels[3], expression(italic(PL)~"("*"mm"*")"))
assign(Labels[4], expression(italic(PW)~"("*"mm"*")")) #分別給4個變量賦值 - 即橫坐標的名稱以及單位
Labels1, Labels2, Labels3, Labels4的調用通過get()函數。嵌套print(),檢驗是否賦值正確
for (i in 1:1:4){
print(get(paste("Labels",i,sep="")))
} #使用for循環,循環調用 - Labels1, Labels2, Labels3, Labels4
三. for 循環中調用ggplot,實現批量繪圖:
重申一下,本篇教程解決的問題是 - 以iris數據集中的前3個變量為自變量,第4個變量Petal.Width為因變量,用ggplot批量繪制散點圖,并用簡單線性回歸擬合。
先加載程序需要的安裝包
library(ggplot2)
for 循環中調用ggplot,實現批量繪圖
windowsFonts(roman=windowsFont("Times New Roman")) #圖中字體使用新羅馬
options(scipen=200) #不使用科學計數法
for (i in 1:3){
p<-ggplot(data =iris, mapping = aes(x=iris[,i], y=iris[,4]))+
geom_point(alpha = 0.5,size = 8)+ #alpha控制點的透明度,可以輔助檢驗重合點
geom_smooth(size=3,method=lm,se=FALSE)+
xlab(get(paste("Labels",i,sep="")))+ #用get()函數分別調用前三個自變量(Labels1,Labels2,Labels3)的名稱以及單位
ylab(get(paste("Labels",4,sep="")))+ #用get()函數調用第四個因變量(Labels4)的名稱以及單位
theme_bw()+
theme(axis.text.x = element_text(size=30, face = "bold",family = "roman"))+
theme(axis.text.y = element_text(size=30, face = "bold",family = "roman"))+
theme(axis.title.x = element_text(angle = 00, hjust = 0.5, size=50,color="black",family = "roman"))+
theme(axis.title.y = element_text(angle = 90,vjust=0.5, hjust = 0.5, size=50, color="black",family = "roman"))
#存儲批量生成的圖片
setwd('C:/Users/zhang/Desktop/自媒體/簡書/ggplot批量畫圖/iris')
ggsave(filename=paste(colnames(iris[i]),".png",sep=""),plot=p,width =17,height=10) #以自變量的名稱為文件名
}
用Photoshop排了一下版(也可以直接用R排版,但是稍微有些許麻煩),得到散點圖集如下:
看,是不是也像模像樣! 會批量畫3個圖,就會批量畫上百個圖,道理其實是一樣的。下一篇教程見!