问题描述
我的示例数据框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
在线图中绘制var3
和ggplot2
,但是我想为每个唯一的ID
值单独绘制。到目前为止,我已经可以通过用唯一的df
子集ID
来设置变量,然后绘制变量来做到这一点。例如,我有这段代码
df1<- subset(df1,df1$ID == 1)
ggplot(df2,aes(var2,var3)) +
geom_line() +
geom_point()
哪个产生以下情节
这很好用,但是使用了很多代码,并且我的真实数据集中有数十个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创建