更简单的代码可根据列值在R中生成多个图?

问题描述

我的示例数据框df如下

df <- data.frame(ID = c(1,1,2,3,4,4),var1 = c('a','a','b','b'),var2 = c(2000,2001,2000,2001),var3 = c(1:8))

结果

  ID var1 var2 var3
1  1    a 2000    1
2  1    a 2001    2
3  2    a 2000    3
4  2    a 2001    4
5  3    b 2000    5
6  3    b 2001    6
7  4    b 2000    7
8  4    b 2001    8

我的目标是使用var2在线图中绘制var3ggplot2,但是我想为每个唯一的ID值单独绘制。到目前为止,我已经可以通过用唯一的df子集ID来设置变量,然后绘制变量来做到这一点。例如,我有这段代码

df1<- subset(df1,df1$ID == 1)
ggplot(df2,aes(var2,var3)) +
       geom_line() +
       geom_point()

哪个产生以下情节

plot1

这很好用,但是使用了很多代码,并且我的真实数据集中有数十个ID值,因此我希望能够更快,更高效地执行此操作。有什么办法可以使用循环或函数吗?我对R还是很陌生,很沮丧。谢谢。

解决方法

最简单的方法是使用facet_wrap,但这会将您所有的绘图放在一页上,如果您有很多ID,该页将无法使用。相反,您可以创建所有图并将它们存储在列表中:

library(ggplot2)

df <- data.frame(ID = c(1,1,2,3,4,4),var1 = c('a','a','b','b'),var2 = c(2000,2001,2000,2001),var3 = c(1:8))

plot_list <- lapply(split(df,df$ID),function(x)
{
  ggplot(x,aes(var2,var3)) +
         geom_line() +
         geom_point()
})

现在,您可以像以下那样轻松地绘制它们:

plot_list[[1]]

plot_list[[2]]

plot_list[[3]]

plot_list[[4]]

或者您可以通过简单的循环将其保存到文件中

for(i in seq_along(plot_list)) ggsave(paste0("plot_",i,".png"),plot_list[[i]])

这会将所有四个图保存为工作目录中名为“ plot_1.png”的文件到“ plot_4.png”。

reprex package(v0.3.0)于2020-08-12创建