在lapply中分离绘图标题

3

我有一些对象,希望将它们一起绘制在一页上,并为每个对象设置单独的标题。目前,我有一个包含所有绘图标题的向量,我将其传递给lapply中的ggtitle函数,但它只将此向量的第一个条目添加到每个图中。

以下是一个简单而丑陋的最小示例:

library(ggplot2)
library(gridExtra)

#My 'data'
A.a <- rnorm(10)
A.b <- rnorm(30)
lmnames <- ls(pattern = "A.*")

titlenames <- c("Plot A", "Plot B")

plotlist <- list()
#I have a more complex ggplot function in reality, but I'm using qplot here as a placeholder.
plotlist <- lapply(lmnames, FUN=function(x,y){qplot(get(x)) + ggtitle(y)}, y=titlenames)

grid.arrange(grobs = plotlist)

看起来是这样的: 使用lapply中的ggtitle标签不正确 你可以看到,两个图都标记为“Plot A”。我希望每个图都有相应的标签。有人能帮我看看我错过了什么吗?谢谢。
3个回答

4

您的问题在于,所有的图表标题都是"Plot A" "Plot B",请查看plotlist[[1]]$labels$title

以下是一个可行的代码:

plotlist <- lapply(1:length(lmnames), function(x){
  qplot(get(lmnames[x])) + ggtitle(titlenames[x])
})

我相信还有更加优雅的解决方案,但是这个方案也能够起到作用。

祝好, J_F


2
循环多个变量时,使用mapply通常更加简洁。
library(ggplot2)
library(gridExtra)

dl <- list("Plot A" = rnorm(10), "Plot B" = rnorm(10))
plot_fun <- function(x, y) qplot(x) + ggtitle(y)
grid.arrange(grobs = Map(plot_fun, x = dl, y = names(dl)))

enter image description here


谢谢,这很好,但是有没有一种方法可以从工作区中抓取所有类似命名的对象,就像我使用lmnames <- ls(pattern = "A.*")那样,并自动命名它们,而不是像您的示例中手动进行命名和对象列表?我之所以问这个问题,是因为在我的实际情况中,我有超过2个要绘制的对象。 - KerrBer
1
mget可以帮助,但通常最好不要让太多对象留在工作区中。在R中,将它们保持在一个列表中通常是更好的策略。 - baptiste

0

这个很好用:

plotlist <- lapply(1:2, FUN=function(i){qplot(get(lmnames[i])) + ggtitle(titlenames[i])})

或者这样:

plotlist <- apply(data.frame(lmnames, titlenames), 1, FUN=function(x){qplot(get(x[1])) + ggtitle(x[2])})

enter image description here

问题在于在两次迭代中,只读取了y=titlenames的第一个值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接