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

Simpler code to generate multiple plots in R based on column values?

我的示例数据框df如下

df <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 4, 4),
              var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
              var2 = c(2000, 2001, 2000, 2001, 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

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

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, 2, 3, 3, 4, 4),
              var1 = c('a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'),
              var2 = c(2000, 2001, 2000, 2001, 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 创建