首页 > 解决方案 > 循环遍历数据框列表并为每个数据框保存单独的图表

问题描述

新手编码器在这里。我正在编写一个脚本,该脚本会在一年内生成不同的个人情绪评级图表。到目前为止,我可以提取一个人 (ID) 的数据并创建他们各自的图表(下面的脚本),但是对于一大群人来说,手动执行这是不切实际的。我需要一种方法让这个脚本在列表中循环,并为每个人保存单独的图表。我曾尝试使用 lapply,但我不确定如何让它包含所有这些步骤并不断遇到错误(例如找不到对象“周”)。任何帮助将不胜感激!

ALIFE_transpose_split = split(ALIFE_transposed, ALIFE_transposed$ID)

#Loop would start here, pulling 1038 as an example

ALIFE_1038 <- ALIFE_transpose_split[["1038"]]

ALIFE_1038_plot <- ALIFE_1038 %>%
  select(Week, MDD_PSR, GAD_PSR, ADHD_PSR) %>%
  gather(key = "Module", value = "PSR", -Week)

ggplot(ALIFE_1038_plot, aes(x = Week, y = PSR)) +
  geom_line(aes(color = Module, linetype = Module)) +
  scale_color_manual(values = c("yellow4", "blue", "darkred")) +
  scale_linetype_manual(values = c("solid","twodash", "solid")) +
  ylim(1, 6)

ggsave(
  filename="ALIFE_1038_plot_20210122.png",
  plot = last_plot(),
  device = NULL,
  path = "../..",
  scale = 1,
  width = 13,
  height = 8,
  units = c("in"),
  dpi = 300,
  limitsize = TRUE,
) 

输出链接: ALIFE_1038_plot_20210122.png

这是我尝试过的,错误返回:

ALIFE_transpose_split <- lapply(ALIFE_transpose_split, function(x) x %>%
         select(Week, MDD_PSR, GAD_PSR, ADHD_PSR) %>%
         gather(key = "Module", value = "PSR", -Week) )

plotdata <- function(x) {
ggplot(data = x, aes(x = Week, y = PSR)) + 
  geom_line(aes(color = Module, linetype = Module)) + 
  scale_color_manual(values = c("yellow4", "blue", "darkred")) +
  scale_linetype_manual(values = c("solid","twodash", "solid")) +
  ylim(1, 6)

ggsave(
  filename=ALIFE_transpose_split$ID,
  plot = last_plot(),
  device = NULL,
  path = "../..",
  scale = 1,
  width = 13,
  height = 8,
  units = c("in"),
  dpi = 300,
  limitsize = TRUE,
) 
}

lapply(ALIFE_transpose_split, plotdata)



Error: `device` must be NULL, a string or a function.
Run `rlang::last_error()` to see where the error occurred. 
7.
stop(fallback) 
6.
signal_abort(cnd) 
5.
abort("`device` must be NULL, a string or a function.") 
4.
plot_dev(device, filename, dpi = dpi) 
3.
ggsave(filename = ALIFE_transpose_split$ID, plot = last_plot(), 
    device = NULL, path = "../..", scale = 1, width = 13, height = 8, 
    units = c("in"), dpi = 300, limitsize = TRUE, ) 
2.
FUN(X[[i]], ...) 
1.
lapply(ALIFE_transpose_split, plotdata)

这是列表数据的样子:

> dput(ALIFE_transpose_split)
list(`1027` = structure(list(ID = c(1027, 1027, 1027, 1027, 1027, 
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
1027, 1027, 1027, 1027), Week = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
58, 59, 60, 61, 62, 63, 64), MDD_PSR = c(NA, NA, NA, 2, 2, 2, 
2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), ADHD_PSR = c(NA, 
NA, NA, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA), GAD_PSR = c(NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, 
-64L), class = c("tbl_df", "tbl", "data.frame")), `1038` = structure(list(
    ID = c(1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
    1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
    1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
    1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
    1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
    1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
    1038, 1038, 1038, 1038, 1038), Week = c(1, 2, 3, 4, 5, 6, 
    7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
    37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64), MDD_PSR = c(NA, 
    2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 5, 5, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA), ADHD_PSR = c(NA, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA), GAD_PSR = c(NA, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
    2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA)), row.names = c(NA, -64L), class = c("tbl_df", "tbl", 
"data.frame")))

标签: rloopsggplot2

解决方案


如果你 facet_wrap 怎么办?

从您的数据创建 df...

ID <- c(1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
        1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
        1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
       1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 
        1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027)
Week = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 
        26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 
        42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
        58, 59, 60, 61, 62, 63, 64)
MDD_PSR = c(NA, NA, NA, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
           1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
ADHD_PSR = c(NA,   NA, NA, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA, 
             NA, NA, NA, NA)
GAD_PSR = c(NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) 

b <- data.frame(ID,Week, MDD_PSR,ADHD_PSR,GAD_PSR)                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                    
ID <- c(1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
       1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
       1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
       1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
       1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
       1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 
       1038, 1038, 1038, 1038, 1038)
Week <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
        22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 
        37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64)
MDD_PSR <- c(NA,2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
             1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
             1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 5, 5, NA, NA, NA, NA, 
              NA, NA, NA, NA, NA, NA, NA) 
ADHD_PSR <- c(NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
              1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
              1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, 
              NA, NA, NA, NA)
GAD_PSR <- c(NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
           2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
c <- data.frame(ID,Week, MDD_PSR,ADHD_PSR,GAD_PSR)

f <- rbind.data.frame(b,c)

让图表彼此相邻显示

c_plot <- f %>%
  group_by(ID) %>%
  gather(key = "Module", value = "PSR", -Week, -ID)

  ggplot(data = c_plot , aes(x = Week, y = PSR)) + 
    geom_line(aes(color = Module, linetype = Module)) + 
    scale_color_manual(values = c("yellow4", "blue", "darkred")) +
    scale_linetype_manual(values = c("solid","twodash", "solid")) +
    ylim(1, 6)+
    facet_wrap(.~ID)

或者...这会从您的代码中获取错误

c_plot <- f %>%
  group_by(ID) %>%
  gather(key = "Module", value = "PSR", -Week, -ID)
  
  
  ALIFE_transpose_split = split(c_plot, c_plot$ID)

plotdata <- function(x) {
ggplot(data = x, aes(x = Week, y = PSR)) + 
  geom_line(aes(color = Module, linetype = Module)) + 
  scale_color_manual(values = c("yellow4", "blue", "darkred")) +
  scale_linetype_manual(values = c("solid","twodash", "solid")) +
  ylim(1, 6)

ggsave(
  filename="figure%03d.pdf",
  plot = last_plot(),
  device = "pdf",
  path = "./",
  scale = 1,
  width = 13,
  height = 8,
  dpi = 300,
  units = c("in"),
  limitsize = TRUE) 
}

推荐阅读