由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个图,就会批量画上百个图,道理其实是一样的。下一篇教程见!