R语言数据可视化之多幅图形的组合及输出

科研绘图通常需要批量形成多幅图形,强大的ggplot2可以帮助我们高效绘制图形,但在多个子图的组合上仍然不太给力。我在连续不断的踩坑中摸索出了2个比较简便的方法,在这里记录和分享给大家,希望能对大家有所帮助~

1. 数据

用R语言自带的iris鸢尾花数据集为例来进行展示。

首先,我们可以用head()查看一下数据的主要内容。

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

可以发现,前4个变量是数值型,最后1个变量是字符型。

2. 方法

2.1 par()+multiplot()

如果我们输出少于3张,并且不能循环跑的图(比如说有很多特定的参数要挨个调整,或者不同类型的图的组合),用par()画图,multiplot()拼图比较方便。

这里我将两张不同类型的图组合在一起,方便大家理解。

第一张图是散点图,以iris数据集的第1个变量(Sepal.Length)作为因变量,第2个变量(Sepal.Width)为自变量绘制的;第二张图是柱状图,展示了不同品种的Sepal.Length。

代码如下:

library(ggplot2)

mainDir <-"C:/CSDN/R语言/" # 图片的储存位置

labels <- colnames(iris) # 获取iris数据集的列名

# 开始画图
plot.layout = c(1,2) # 确定好行和列
windows(width = 10, height = 5) # 确定好宽和高
par(mfrow = plot.layout)

# 散点图
p1 <- ggplot(data =iris,aes(x=iris[,2], y=iris[,1]))+
      geom_point(alpha = 0.5,size = 8)+
      geom_smooth(size=2,method=lm,se=FALSE)+
      labs(x = labels[2], y = labels[1])+
      theme_bw() + theme(panel.grid=element_blank(),
                     legend.position="none",
                     axis.title.x = element_text(size = 16),
                     axis.title.y = element_text(size = 16),
                     axis.text.x = element_text(size = 14,colour = 'black'),
                     axis.text.y = element_text(size = 14,colour = 'black'))
# 柱状图
p2 <- ggplot(data =iris, aes(x=iris[,1], y=iris[,5]))+
      geom_bar(stat="identity",fill="steelblue",width = 0.6)+
      labs(x = labels[1], y = labels[5])+
      coord_flip()+
      theme_bw() + theme(panel.grid=element_blank(),
                         legend.position="none",
                         axis.title.x = element_text(size = 16),
                         axis.title.y = element_text(size = 16),
                         axis.text.x = element_text(size = 14,colour = 'black'),
                         axis.text.y = element_text(size = 14,colour = 'black'))

# 将两张图拼在一起,这里有两种方法
Rmisc::multiplot(p1,p2,cols=2)
# ggpubr::ggarrange(p1, p2, ncol=2, nrow=1)

# 储存,注意这里不能用ggsave()
savePlot(filename = paste(mainDir,'plot'),type = "jpg")
savePlot(filename = paste(mainDir,'plot'),type = "pdf")
dev.off()

得到这样的组合图:

PS: 直接输出的jpg图片可能比较糊,所以我会再输出一个pdf格式的图,之后在AI里也更好调整。

2.2 lapply()+cowplot()

对于参数一致并且数量非常多的图,我们可以用lapply批量做图,再用cowplot拼图。

这里我批量做了3个散点图给大家演示:iris的第1个变量(Sepal.Length)为因变量,第2~4个变量为自变量,代码如下:

library(ggplot2)

mainDir <-"C:/CSDN/R语言/" # 图片的储存位置

labels <- colnames(iris) # 获取iris数据集的列名

# 做图
my_plot <- function(i){
   ggplot(data =iris,aes(x=iris[,i], y=iris[,1]))+
      geom_point(alpha = 0.5,size = 8)+
      geom_smooth(size=2,method=lm,se=FALSE)+
      labs(x = labels[i], y = labels[1])+
      theme_bw() + theme(panel.grid=element_blank(),
                         legend.position="none",
                         axis.title.x = element_text(size = 16),
                         axis.title.y = element_text(size = 16),
                         axis.text.x = element_text(size = 14,colour = 'black'),
                         axis.text.y = element_text(size = 14,colour = 'black'))
   
}

my_list <- lapply(2:4, my_plot)

lapply可以把一个个绘图对象保存到一个列表。

我们先定义了一个绘图函数my_plot,其中i是我们的自变量(iris的第2~4列),其他参数均保持不变。

再根据lapply的描述:lapply(X, Fun),X是一个向量或表达式对象,Fun是函数。将X=2:4, Fun=my_plot填进去,得到如下列表:

在这里插入图片描述
接着我们再用cowplot将这一个个对象组合起来:

# cowplot拼图
p <- cowplot::plot_grid(plotlist = my_list, # 列表
                         nrow = 1, ncol = 3, # 设置行列
                         labels = "auto",label_size = 20, # 设置标签
                         scale = c(0.9)) # 为了美观,缩放一下图
p

# 输出jpg和pdf
cowplot::save_plot(paste(mainDir,'myplot.jpg',sep=""), 
                   p, 
                   base_height = 5,
                   base_width = 15) 
cowplot::save_plot(paste(mainDir,'myplot.pdf',sep=""), 
                   p,
                   base_height = 5,
                   base_width = 15)

最后就会得到我们的组合图啦
在这里插入图片描述
怎么样,是不是非常简单?

更复杂的方法
其实更优雅、更快速的方法是使用管道。

library(magrittr)
library(cowplot)

my_cow <- lapply(2:4, my_plot) %>% 
   plot_grid(plotlist = ., nrow = 1, ncol = 3,
             labels = "auto",label_size = 20,
             scale = c(0.9)) %>%
   save_plot(paste(mainDir,'pplot.jpg',sep=""), .,
             base_height = 5,
             base_width = 15)

如果大家觉得有用的话,不要忘记点赞收藏关注我呀~ 会持续更新R语言可视化相关干货:)

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值