【问题标题】:plotting a list of grobs绘制 grobs 列表
【发布时间】:2016-03-11 14:33:40
【问题描述】:

披露:我不确定如何为这个问题制作一个可重现的例子。

我正在尝试使用 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 = ggplots 列表

rawplot = ggplots 列表

gridplots_specgridplots_Raw = 来自上述 ggplots 的 grobs 列表。

g = 上面两个 grobs 组合的列表,因此组合 gridplots_spec[1]gridplots_raw[1] 以此类推,以获取列表的长度。

现在我的目标是将所有这些绘制成 2 列。但是每当我通过 grid.draw 循环传递gridplots_spec[i] 时,我都会收到一个错误:

Error in UseMethod("grid.draw") : no applicable method for 'grid.draw' applied to an object of class "list"

我不能取消它,因为它只是变成了一个长字符向量。有什么想法吗?

如果这绝对是至关重要的,我可以花时间制作一个可重现的示例,但我更有可能只是错过了一个简单的步骤。

【问题讨论】:

  • 查看[[[ 之间的区别。试试grid.draw(g[[i]])
  • 我做到了,Error in gList(list(list(grobs = list(list(x = 0.5, y = 0.5, width = 1, : only 'grobs' allowed in "gList"
  • 好吧,你在前面的for循环中犯了同样的错误。
  • 错误告诉你出了什么问题。罗兰又是对的。当您应该使用两个时,您正在使用一个支架。您在上一个问题stackoverflow.com/questions/35869978/… 中做了同样的事情。不要使用单括号来访问列表的元素。
  • 不仅仅是缺少一个简单的步骤,您的代码似乎对您使用的某些功能存在许多误解,因此花时间制作一个最小的可重现示例确实是值得的。从长远来看,它可能更省时,因为您会更好地了解每个功能在做什么。

标签: r gridextra grob


【解决方案1】:

这是我对您的脚本的解释,如果这不是预期的结果,您可能希望使用一些零碎的东西来使您的问题可重现。

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)

编辑我无法抗拒这种恶作剧的技巧来为绘图着色;随意忽略它。

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)

【讨论】:

  • 我一直在寻找关于如何调整 grobs 高度大小的示例,并且在我尝试运行它们时反复出现 - 包括这里的示例,完全按照书面方式运行 - 我得到了这个错误的变化:[&lt;-.unit(*tmp*, unique(panels$t), value = list(4, 1)) 中的错误:分配的值必须是一个单位 gtable 中是否有一些更改需要更新此代码?
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多