代码之家  ›  专栏  ›  技术社区  ›  blazej

在4个因素的组合上迭代3路交互ggplot调用

  •  2
  • blazej  · 技术社区  · 6 年前

    免责声明:更好的标题建议非常受欢迎

    我很难搞清楚我该如何迭代 ggplot2 调用3个因素的不同组合。我可以根据数据来描述这个。。。 但如果有不清楚的地方,请询问/评论(英语不是我的主要语言)

    给定这样的数据帧:

    library(ggplot2)
    library(dplyr)
    library(gtools)
    
    # Make up data
    set.seed(1)
    df <- data.frame(y = rnorm(16),
                     factor1 = gl(2, 1, 16), 
                     factor2 = gl(2, 2, 16),
                     factor3 = gl(2, 4, 16),
                     factor4 = gl(2, 8, 16))
    

    考虑到4个因素( factor1:factor4 )由3个元素组成的24个独特组合,我称之为:

    • x axis
    • lines
    • facets

    储存在 p :

    p <- data.frame(
          permutations(4,3, c("factor1", "factor2", "factor3", "factor4")))
    names<- c("x axis", "lines", "facets")
    colnames(p) <- names
    
    > head(p)
       x axis   lines  facets
    1 factor1 factor2 factor3
    2 factor1 factor2 factor4
    3 factor1 factor3 factor2
    4 factor1 factor3 factor4
    5 factor1 factor4 factor2
    6 factor1 factor4 factor3
    

    如何自动绘制24个图形,以便:

    • 价值观 X轴 , 线 从每一排 第页 逐一地
    • df$y 总结( mean(y, na.rm=T )跨越相应因素
    • 显示了一个图

    如果我在哪里手动绘制,则第四个图(24个图中的一个)将如下所示:

    p[4,]
       x axis   lines  facets
    4 factor1 factor3 factor4
    
    df %>% group_by(factor1, factor3, factor4) %>%
          summarise(y=mean(y, na.rm=T)) %>% 
          ggplot(aes(y=y, x = factor1)) +
          geom_line(aes(group=factor3, color=factor3)) +
          facet_grid(~factor4)
    

    而第24天是这样的:

    > p[24,]
        x axis   lines  facets
    24 factor4 factor3 factor2
    
        df %>% group_by(factor4, factor3, factor2) %>%
              summarise(y=mean(y, na.rm=T)) %>% 
              ggplot(aes(y=y, x = factor4)) +
              geom_line(aes(group=factor3, color=factor3)) +
              facet_grid(~factor2)
    

    有人能帮我解决这个问题吗?

    编辑1

    我已经能写 for() 循环以聚合数据,但对于resons,我并没有低估所有24个数据帧都是相同的:

     for(i in 1:nrow(p)){
          xaxis <- as.character(p[i,1])
          lines <- as.character(p[i,2])
          facets <- as.character(p[i,3])
          colnames(df)[colnames(df) == xaxis[i]] <- "xaxis"
          colnames(df)[colnames(df) == lines[i]] <- "lines"
          colnames(df)[colnames(df) == facets[i]] <- "facets"
          print(df %>% group_by(xaxis, lines, facets) %>%
                      summarise(y=mean(y, na.rm=T)))
          }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Parfait    6 年前

    考虑R基 Map (包装到 mapply )作为通过置换数据帧按元素迭代的替代方法。

    p <- data.frame(permutations(4,3, c("factor1", "factor2", "factor3", "factor4")),
                    stringsAsFactors = FALSE) %>% 
             setNames(c("xaxis", "lines", "facets"))
    
    runplots <- function(x, l, f) {      
      df2 <- df[c("y", x, l, f)] %>% 
               setNames(c("y", "xaxis", "lines", "facets"))
    
      print(df2 %>% 
              group_by(xaxis, lines, facets) %>%
              summarise(y=mean(y, na.rm=T)) %>%
              ggplot(aes(y=y, x = xaxis)) +
                geom_line(aes(group=lines, color=lines)) +
                facet_grid(~facets))
    }
    
    plot_list <- Map(runplots, p$xaxis, p$lines, p$facets)
    

    因为你保留了一个输出为 地图 ,您可以使用该对象在其他地方继续使用。均匀移动 print 调用图如下所示:

    # BY INDEX
    plot_list[[1]]
    plot_list[[2]]
    ...
    
    # BY NAME (AFTER RENAMING LIST)
    names(plot_list) <- gsub("factor", "f", paste(p$xaxis, p$lines, p$facets, sep="_"))
    plot_list$f1_f2_f3
    plot_list$f1_f2_f4
    ...
    
        2
  •  2
  •   blazej    6 年前

    好 啊。。。我花了半天的时间反复试验,但最终还是成功了

    组成数据

    library(ggplot2)
    library(dplyr)
    library(gtools)
    
    
    set.seed(1)
    df <- data.frame(y = rnorm(16),
                     factor1 = gl(2, 1, 16), 
                     factor2 = gl(2, 2, 16),
                     factor3 = gl(2, 4, 16),
                     factor4 = gl(2, 8, 16))
    
    p <- data.frame(
          permutations(4,3, c("factor1", "factor2", "factor3", "factor4")))
    names<- c("xaxis", "lines", "facets")
    colnames(p) <- names
    

    绘制绘图

    for(i in 1:nrow(p)){
          xaxis <- as.character(p[i,1])
          lines <- as.character(p[i,2])
          facets <- as.character(p[i,3])
          df2 <- df %>% rename(xaxis= colnames(df)[colnames(df) == xaxis],
                             lines= colnames(df)[colnames(df) == lines],
                             facets= colnames(df)[colnames(df) == facets])
          print(df2 %>% 
                      group_by(xaxis, lines, facets) %>%
                      summarise(y=mean(y, na.rm=T)) %>%
                      ggplot(aes(y=y, x = xaxis)) +
                      geom_line(aes(group=lines, color=lines)) +
                      facet_grid(~facets))
    }
    

    我会把这个作为一个开放的答案,如果有人想给我展示更优雅的东西(只是为了我的好奇心),我非常乐意接受。