绘制一系列grobs的列表

4

提示:我不确定如何为这个问题创建一个可重现的示例。

我正在尝试使用gridExtra包绘制一系列的grobs。

我有一些类似于以下代码:

## Make Graphic Objects for Spec and raw traces
for (i in 1:length(morletPlots)){
  gridplots_Spec[[i]]=ggplotGrob(morletPlots[[i]])
  gridplots_Raw[[i]]=ggplotGrob(rawPlot[[i]])
  gridplots_Raw[[i]]$widths=gridplots_Spec[[i]]$widths
}
names(gridplots_Spec)=names(morletPlots)
names(gridplots_Raw)=names(rawPlot)

## Combine spec and Raw traces
g=list()
for (i in 1:length(rawPlot)){
    g[[i]]=arrangeGrob(gridplots_Spec[i],gridplots_Raw[i],heights=c(4/5,1/5))
}

numPlots = as.numeric(length(g))

##Plot both
for (i in 1:numPlots){

  grid.draw(g[i],ncol=2)
}

让我来解释一下这段代码。
`morletPlots` 是一个 ggplot 的列表。
`rawplot` 是另一个 ggplot 的列表。
`gridplots_spec` 和 `gridplots_Raw` 是从上面的 ggplot 中制作的 grobs 的列表。
`g` 是将上述两个 grobs 组合在一起的列表,因此对于列表的长度,要组合 `gridplots_spec[1]` 和 `gridplots_raw[1]` 以及其他相应索引的元素。
现在,我的目标是将它们全部绘制成两列。但是,每当我通过 `grid.draw` 循环传递 `gridplots_spec[i]` 时,都会出现错误:
"Error in UseMethod("grid.draw") :no applicable method for 'grid.draw' applied to an object of class "list"
我不能解压它,因为它只会变成一个很长的字符向量。有什么想法吗?
如果非常关键,我可以花时间制作一个可复现的示例,但我更可能是漏掉了一些简单的步骤。

2
查找[[[之间的区别。尝试使用grid.draw(g[[i]]) - Roland
我得到了一个错误信息:Error in gList(list(list(grobs = list(list(x = 0.5, y = 0.5, width = 1, : only 'grobs' allowed in "gList" - Ted Mosby
在前面的 for 循环中,你犯了同样的错误。 - Roland
2
错误提示了你的问题所在。再次证明Roland是正确的。你使用了单个括号,而应该使用两个括号。你在之前的一个问题中也犯了同样的错误https://dev59.com/m5Tfa4cB1Zd3GeqPWtsM。不要使用单个括号来访问列表元素。 - Pierre L
你的代码不仅仅是缺少一些简单的步骤,而且似乎存在对某些函数的误解,因此花时间制作一个最小可重现示例真的很值得。从长远来看,这可能更加高效,因为你将更好地理解每个函数正在做什么。 - baptiste
1个回答

7
以下是我对您的脚本的解释。如果这不是您想要的结果,您可能需要使用一些片段来使您的问题能够再现。
library(grid)
library(gridExtra)
library(ggplot2)

morletPlots <- replicate(5, ggplot(), simplify = FALSE)
rawplot <- replicate(5, ggplot(), simplify = FALSE)

glets <- lapply(morletPlots, ggplotGrob)
graws <- lapply(rawplot, ggplotGrob)

rawlet <- function(raw, let, heights=c(4,1)){
  g <- rbind(let, raw)
  panels <- g$layout[grepl("panel", g$layout$name), ]
#  g$heights <- grid:::unit.list(g$heights) # not needed
  g$heights[unique(panels$t)] <- lapply(heights, unit, "null")
  g
}

combined <- mapply(rawlet, raw = graws, let=glets, SIMPLIFY = FALSE)

grid.newpage()
grid.arrange(grobs=combined, ncol=2)

在此输入图片描述

编辑 我无法抵制这种淘气的hack来给图表着色以进行说明,如果你觉得不必要可以忽略它。

palette(RColorBrewer::brewer.pal(8, "Pastel1"))
ggplot.numeric = function(i) ggplot2::ggplot() + 
  theme(panel.background=element_rect(fill=i))

morletPlots <- lapply(1:5, ggplot)
rawplot <- lapply(1:5, ggplot)

enter image description here


我一直在 Stack Overflow 上寻找如何调整 grobs 高度的示例,但是每当我尝试运行它们时(包括这里的示例,按照原样运行),我都会得到类似于以下错误的变化:Error in [<-.unit(*tmp*, unique(panels$t), value = list(4, 1)) : Value being assigned must be a unit是否有 gtable 中的某些更改需要更新此代码? - neuropsych

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