在lapply期间将list-objects的名称粘贴到ggplot调用中

时间:2018-04-26 11:28:56

标签: r ggplot2

我有一个ggplot-objects列表

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

我哪里失败了?

2 个答案:

答案 0 :(得分:2)

问题在于您使用lapply松开了您迭代的列表的名称。

如果你检查

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

然后你会看到names(x)返回

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

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

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

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

output

答案 1 :(得分:2)

以下是使用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