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

在lappy期间将列表对象的名称粘贴到ggplot调用中

  •  2
  • nouse  · 技术社区  · 7 年前

    我有一个ggplot对象列表

    library(ggplot2)
    library(gridExtra)
    p <- ggplot(mtcars, aes(factor(cyl))) + geom_bar()
    plots <- list(p,p,p)
    names(plots) <- c("A","B","C")
    

    我可以操纵:

    plots <- lapply(plots, function(x) x + theme_bw())
    grid.arrange(plots[[1]], plots[[2]], plots[[3]])
    

    这很好用。但是,我无法将ggplot对象的名称粘贴到 ggtitle -参数:

    plots <- lapply(plots, function(x) x + ggtitle(paste(names(x))))
    grid.arrange(plots[[1]], plots[[2]], plots[[3]])
    

    有些东西被粘贴到了参数中,但我基本上错过了正确的层次结构级别:

    grid.arrange(plots[[1]], plots[[2]], plots[[3]]) ### all titled "data"
    names(plots[[1]][1])
    [1] "data"
    

    向上移动层次结构不起作用:

    plots <- lapply(plots, function(x) x + ggtitle(paste(names(plots[[x]]))))
    
     Error in plots[[x]] : invalid subscript type 'list'
    

    我记得一个 old question of mine for base-R plotting ,但无法在此处传输:

    plots <- lapply(names(plots), function(x) plots[[x]] + ggtitle(paste(names(x))))
    names(plots)
    NULL
    

    我在哪里失败了?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Maurits Evers    7 年前

    以下是使用 Map :

    # Your sample plots
    library(ggplot2)
    library(gridExtra)
    p <- ggplot(mtcars, aes(factor(cyl))) + geom_bar()
    plots <- list(p,p,p)
    names(plots) <- c("A","B","C")
    plots <- lapply(plots, function(x) x + theme_bw())
    
    # Add title to ggplots
    plots <- Map(function(gg, title) gg + ggtitle(title), plots, names(plots));
    grid.arrange(grobs = plots);
    

    enter image description here

        2
  •  2
  •   clemens    7 年前

    问题是您丢失了迭代使用的列表的名称 lapply .

    如果你检查

    lapply(plots, function(x) browser())
    

    然后你就会看到 names(x) 退货

    [1] "data"        "layers"      "scales"      "mapping"     "theme"       "coordinates" "facet"      
    [8] "plot_env"    "labels" 
    

    迭代添加标题的一种方法是迭代索引并将其用于子集 plots names(plots) :

    plots <- lapply(seq_along(plots), function(i) { 
      plots[[i]] + ggtitle(names(plots)[i])
    })
    

    然后,将添加标题,例如 plots[[1]] :

    output

        3
  •  1
  •   nniloc    3 年前

    使用添加另一个选项 cowplot::plot_grid 我觉得这很有帮助。

    cowplot::plot_grid(plotlist = plots, 
                       labels = names(plots),
                       ncol = 1)
    

    enter image description here


    数据

    p <- ggplot(mtcars, aes(factor(cyl))) + geom_bar()
    plots <- list(p,p,p)
    names(plots) <- c("A","B","C")
    plots <- lapply(plots, function(x) x + theme_bw())