我有一个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
我哪里失败了?
答案 0 :(得分:2)
问题在于您使用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]]
:
答案 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);