如何将ggplot对象的向量传递给grid.arrange函数?

6
也许这个问题已经被问过并解决了,但是那个解决方案对我不起作用。 我编写了一个函数,能够创建ggplot对象并将它们以向量形式返回。以下是函数内部的代码,vars是我的数据d的列名向量。
plotting <- function(d){
    P <- numeric(0)
    vars <- names(d)[!names(d)%in%c('channel','label')]
    for (var in vars){
        p <- ggplot(d, aes(x=channel,y=var)) + 
             geom_boxplot(aes(fill=label)) + ggtitle(var)
        P <- c(P,p)
    }
    return(list(plots=P, num=length(vars)))
}

我想要做的是使用上述函数来返回一个由多个ggplot对象组成的列表P,如下所示,这是“手动”版本可以正常工作的方式:
p1 <- ggplot()+ ...
p2 <- ggplot()+ ...
p3 <- ggplot()+ ...
pdf('...')
grid.arrange(p1, p2, p3, nrow = 3)
dev.off()

返回num的目的是为了在grid.arrange函数的布局参数中后续使用。我将PLOTS作为返回变量:

PLOTS <- plotting(d)
pdf('...')
grid.arrange(PLOTS$plots, PLOTS$num)
dev.off()

然后我收到了一个错误信息:

Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main,  :
input must be grobs!

我尝试了在将向量作为参数列表传递给grid.arrange中提供的解决方案。


注:grid.arrange是it技术中一种用于排版的函数。
do.call(grid.arrange, c(PLOTS$plots, nrow = PLOTS$num))

但仍然得到相同的错误。 非常感谢您的评论。 编辑:更清晰地描述了问题,并在下面粘贴了可重现的数据d
structure(list(percent = c(0.0962463533974437, 0.129409967469436,
0.0150265653130588, 0.00299276735619027, 0.0108596845008112,
0.00407417010800106), songs = c(0.231617443342384, 0.430320945945946,
0.109264389042782, 0.282109656611649, 0.0288753799392097, 0.041635687732342
), label = c("1", "1", "1", "1", "1", "1"), channel = c("2",
"2", "2", "2", "2", "2")), .Names = c("percent", "songs", "label",
"channel"), row.names = c(NA, 6L), class = "data.frame")

请将 d 作为参数输入到 plotting 并继续检查 PLOTS$plots,以帮助我进行调试,谢谢!

3
grid.arrange函数中,省略号需要接收grobs参数。你想要传递的其他参数必须被命名。例如,do.call(grid.arrange, c(P$plots, nrow = P$num))。由于没有提供可重现示例以供测试,我不确定P$plots是否实际上是一个列表(它必须是才能正常工作)。 - Roland
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Francis
1个回答

7
您的绘图函数存在一些问题。首先,您需要将P初始化为一个list。其次,如果您想使用character输入var,则需要使用aes_string而不是aes。然后,您必须使用list(p),以保持ggplot对象完整。
plotting <- function(d){
  P <- list()
  vars <- names(d)[!names(d)%in%c('channel','label')]
  for (var in vars){
    p <- ggplot(d, aes_string(x='channel', y=var)) + 
      geom_boxplot(aes(fill=label)) + ggtitle(var)
    P <- c(P, list(p))
  }
  return(list(plots=P, num=length(vars)))
}

PLOTS <- plotting(d)
do.call(grid.arrange, c(PLOTS$plots, nrow = PLOTS$num))

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