ggplot批量畫圖

由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排版,但是稍微有些許麻煩),得到散點圖集如下:


Fig.1 Scatter plots to show the relations among iris variables. (a) PW vs. PL; (b) PW vs. SL; (c) PW vs. SW

看,是不是也像模像樣! 會批量畫3個圖,就會批量畫上百個圖,道理其實是一樣的。下一篇教程見!

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

推薦閱讀更多精彩內容