ggplot2:annotation_custom提供了一个空图层。

3
一些测试数据:

ltd <- data.frame(r = c(rnorm(10), f1 = c(rep("L", 5), rep("H", 5)),
       f2 = rep(c("A", "B"), 5))

下面是一个最小化的函数:

tf <- function(formula = NULL, data = NULL) {

res <- as.character(formula[[2]]) # clean & prep data
fac1 <- as.character(formula[[3]][2])
fac2 <- as.character(formula[[3]][3])

counts <- count(data, vars = c(fac2, fac1)) # get table data ready
colnames(counts) <- c(fac2, fac1, "count")
myt <- tableGrob(counts, show.box = TRUE,
    show.rownames = FALSE, show.colnames = TRUE,
    show.csep = TRUE, show.rsep = TRUE,
    separator = "black")

p <- ggplot()
p <- p + geom_point(data = data, 
    aes_string(x = fac1, y = res, color = fac2, group = fac2))      
p <- p + annotation_custom(myt) # comment out and it works
}

运行它:

require("plyr")
require("gridExtra")
require("ggplot2")
tmp <- tf(formula = r~f1*f2, data = ltd)
print(tmp)

给出 Error in if (nrow(layer_data) == 0) return() : argument is of length zero

如果打印tableGrob,它确实存在,所以我不确定发生了什么。如果注释掉annotation_custom,它就可以工作,我认为我遵循了文档。谢谢。(ggplot2_0.9.3)


我的猜测是annotation_custom不喜欢离散轴(例如annotation_raster)。无论如何,您仍需要指定xmin、xmax、ymin、ymax,但在这里仍然无法正常工作。 - baptiste
离散轴是没问题的,我在另一个版本中已经让它正常工作了。但我正在进行一些更改,以使用简单的公式接口并遵守 ggplot2 的最新更改,结果出了问题。 - Bryan Hanson
1个回答

3

这是您问题的解决方案:我将您的data=aes_string调用移到了主要的ggplot调用中。我不知道为什么这很重要,但现在图表可以正常打印而不会出现错误。

p <- ggplot(data=data, aes_string(x=fac1, y=res, color=fac2, group=fac2)) + 
     geom_point() +
     annotation_custom(myt)

enter image description here


不错的发现 :) 在这个函数中,myt是从counts计算出来的,而counts又是从使用变量fac1和fac2计算出来的数据data中计算出来的。你的修复将美学因素fac1和fac2放置在基础层中,因此可以在annotation_raster层中引用这些美学因素,尽管有趣的是它能够工作,因为myt是从counts数据框中生成的,而不是从data中生成的。正如Bryan在另一篇文章中所说,“每个层都需要数据和美学因素” :) 但公平地说,这个错误相当微妙... - Dennis
@Dennis @bdemarest 谢谢。我对这个修复方法感到很困惑,但它确实有效。我不确定是否可以在完整的函数中使用此解决方案(我没有提供),但我会尝试。在完整的函数中,我非常努力地保持所有层彻底分开,因为美学之间存在交叉对话。因此,简单的ggplot()初始化整个过程,而没有默认美学。我真的很想坚持(数据,美学,几何图形)/每个层,但是annotation_custom并不真正符合这一点(但也许问题在于它在幕后确实符合)。 - Bryan Hanson
@BryanHanson 这看起来像是一个bug。你的代码是合法的。这是否与https://github.com/hadley/ggplot2/issues/756相同的问题? - Faheem Mitha

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