gridExtra:使用tableGrob对不同的行进行不同颜色的着色。

9
我有一个关于gridExtra包中的tableGrob/grid.table的问题。使用常规的参数设置,交替行颜色很容易实现。但是,我希望能够更好地控制行的颜色。
例如,是否可以将每个第三行用不同的颜色着色?我怀疑grid.edit函数是解决这个问题的一种方式,根据此链接中的示例:http://code.google.com/p/gridextra/wiki/tableGrob,但我不知道如何将其应用到我的问题上。
我相信发帖人也有同样的想法。Table with rows of different colors with tableGrob 由于兼容性问题,我目前被困在R 2.13中,因此如果有任何建议不涉及较新版本,那将是理想的。
示例代码:
library(gridExtra)

grid.table(mtcars[1:10, ],
           gpar.coretext = gpar(fontsize = 10),
           gpar.corefill = gpar(fill = "lightblue", alpha=0.5, col = NA),
           h.even.alpha = 0.5
           )

example table


2
欢迎来到Stack Overflow,并且很好地引用了其他问题,以展示您已经自己做了一些工作。我可以建议,在未来的问题中,您包括一个可重现的例子,可以使用您自己的数据、'虚假'数据或内置数据集,如mtcars数据集。简单,确实最小化是最好的(我已经为您添加了一个),只需要足够让其他人复制、粘贴和实验即可。 - SlowLearner
1个回答

10

从v>=2.0.0版本开始,gridExtra的grid.table现在基于gtable,并且可以进行比以前更深层次的自定义。 这篇文档提供了更多示例,但为了完整起见,这里有一个示例,说明如何突出显示特定单元格。

g <- tableGrob(iris[1:4, 1:3])
find_cell <- function(table, row, col, name="core-fg"){
  l <- table$layout
  which(l$t==row & l$l==col & l$name==name)
}

ind <- find_cell(g, 3, 2, "core-fg")
ind2 <- find_cell(g, 2, 3, "core-bg")
g$grobs[ind][[1]][["gp"]] <- gpar(fontsize=15, fontface="bold")
g$grobs[ind2][[1]][["gp"]] <- gpar(fill="darkolivegreen1", col = "darkolivegreen4", lwd=5)
grid.draw(g)

编辑:上述函数很容易被“向量化”

find_cells <- function(table, row, col, name="core-fg"){
  l <- table$layout
  unlist(Map(function(r, c) which(((l$t-1) == r) & ((l$l-1) == c) & (l$name == name)), row, col))
}

modify_cells <- function(g, ids, gp=gpar()){
  for(id in ids) g$grobs[id][[1]][["gp"]] <- gp
  return(g)
}

ids <- find_cells(g, 1:3, c(3,2, 1), "core-fg")
g <- modify_cells(g, ids, gpar(fontsize=15, fontface="bold"))

grid.newpage()
grid.draw(g)

请注意,在大多数情况下,指定参数时在表格构建过程中更有意义。

enter image description here

faces <- sample(1:4, size = prod(dim(iris[1:4, 1:2])), replace = TRUE)
tt <- ttheme_default(core=list(fg_params=list(fontface=faces)))

grid.table(iris[1:4, 1:2], theme=tt)

enter image description here


我不知道是否还有人在听,但我会尝试一下:是否可以调整find_cell函数,使其一次性找到多个不同的单元格而不是一个一个地找?例如,所有Sepal.Length>4.8的单元格都以粗体书写。我有一个带有统计显着性测试的tableGrob,我需要所有p值<0.05的单元格都以粗体显示。最好能够将其放入一个函数中,而不是手动为每个单元格进行操作。谢谢 - PaoloCrosetto
“core-fg” 这个名称是什么意思或者有什么作用? - user2946746
表格分为三个部分:列标题、行标题和核心单元格(正文)。每个部分都有两个“层”:背景矩形(这里是灰色的核心,较暗的列标题)和前景(“fg”)用于文本。 - baptiste

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