【问题标题】:Separate plot titles within lapplylapply 中的单独情节标题
【发布时间】:2016-06-07 09:01:21
【问题描述】:

我有许多对象,我想将它们一起绘制在一页上,每个对象都有一个单独的标题。目前,我有一个情节标题向量,我在 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)

看起来像这样:

您可以看到,两个地块都标有“地块 A”。我想相应地标记每个情节。谁能帮我看看我在这里缺少什么?提前致谢。

【问题讨论】:

    标签: r ggplot2 lapply


    【解决方案1】:

    您的问题是,在所有情节中,您的标题都是“情节 A”“情节 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)))
      

      【讨论】:

      • 谢谢,这很好,但是有没有办法从工作区中获取所有类似的命名对象,就像我使用 lmnames &lt;- ls(pattern = "A.*") 的方式一样,并自动命名它们,而不是进行命名和对象列表手动像你的例子?我问是因为在我的真实场景中,我想要绘制的对象不止 2 个。
      • mget 可能会有所帮助,但通常最好不要在工作区中放置很多对象。将它们放在一个列表中通常是 R 中更好的策略。
      【解决方案3】:

      这很好用:

      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])})
      

      问题是在两次迭代中,只有y=titlenames 的第一个值被读取

      【讨论】:

        猜你喜欢
        • 2021-02-02
        • 2016-10-28
        • 2014-10-21
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多