0
点赞
收藏
分享

微信扫一扫

ggplot批量画图

奋斗De奶爸 2021-09-19 阅读 26
科研总结

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

举报

相关推荐

0 条评论