【问题标题】:X-axis labels on uneven facet_wrap rows不均匀 facet_wrap 行上的 X 轴标签
【发布时间】:2014-12-15 14:06:05
【问题描述】:

目前,我正在尝试绘制一个数据集,其中刻面数为奇数,在图中留下不完整的最后一行。理想情况下,我希望在每一个不完整的最后一行和上面的行下方都有 x 轴标签,其中底行是空的。

我已经查看了this question and answer,这似乎完全符合我的要求。但是,似乎自从上次更新此答案以来,ggplot 或 gridExtra 中发生了一些变化,在尝试使用 ggsave 保存时会破坏解决方案。代码不会创建有效文件,而是将TableGrob 的结构打印到控制台(包含在更下方)并生成损坏的 4KB PDF 文件(无法在 OS X 上通过 QuickLook、Preview 或 Adob​​e Reader 打开)。

我尝试使用的代码如下,我认为它与原始链接答案中的代码相匹配:

library(ggplot2)
library(grid)

facetAdjust <- function(x, pos = c("up", "down"))
{
  pos <- match.arg(pos)
  p <- ggplot_build(x)
  gtable <- ggplot_gtable(p); dev.off()
  dims <- apply(p$panel$layout[2:3], 2, max)
  nrow <- dims[1]
  ncol <- dims[2]
  panels <- sum(grepl("panel", names(gtable$grobs)))
  space <- ncol * nrow
  n <- space - panels
  if(panels != space){
    idx <- (space - ncol - n + 1):(space - ncol)
    gtable$grobs[paste0("axis_b",idx)] <- list(gtable$grobs[[paste0("axis_b",panels)]])
    if(pos == "down"){
      rows <- grep(paste0("axis_b\\-[", idx[1], "-", idx[n], "]"), 
        gtable$layout$name)
      lastAxis <- grep(paste0("axis_b\\-", panels), gtable$layout$name)
      gtable$layout[rows, c("t","b")] <- gtable$layout[lastAxis, c("t")]
    }
  }
  class(gtable) <- c("facetAdjust", "gtable", "ggplot"); gtable
}

d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) +
xlim(0, 2) + stat_binhex(na.rm = TRUE) + theme(aspect.ratio = 1) + 
facet_wrap(~ color)

d <- facetAdjust(d)
ggsave("test.pdf",d)

运行时,会产生以下控制台输出:

Saving 7 x 7 in image
TableGrob (16 x 13) "layout": 33 grobs
    z         cells       name                                    grob
1   0 ( 1-16, 1-13) background          rect[plot.background.rect.239]
2   1 ( 4- 4, 4- 4)    panel-1                 gTree[panel-1.gTree.53]
...(shortened)...
32 31 ( 4-12,12-12)  guide-box                       gtable[guide-box]
33 32 ( 2- 2, 4-10)      title               text[plot.title.text.237]

...还会生成一个 4KB 的 PDF 文件,QuickLook、Preview 或 Adob​​e Reader 无法打开。

我已尽我所能查看 facetAdjust 功能,但经验不足,无法确定问题所在。有人对如何解决此问题有任何建议吗?

【问题讨论】:

  • 打印方式混乱,换个顺序试试class(gtable) &lt;- c("facetAdjust", "ggplot", "gtable")
  • 其实看原来的答案,你好像忘记了print.facetAdjust,所以选择了下一个方法为print.gtable,它什么都不画。
  • 为这样一个愚蠢的错误道歉 - 早些时候我已经删除了它,因为在我的调试中它似乎没有被调用(可能是由于我犯了另一个错误,但后来修复了)。添加print.facetAdjust 后,它现在可以正常工作了,谢谢。

标签: r ggplot2 facet-wrap


【解决方案1】:

相当愚蠢,但在调试另一个问题时删除了打印功能,并且没有正确恢复它。正如baptiste 建议的那样,添加以下功能可以解决问题:

print.facetAdjust <- function(x, newpage = is.null(vp), vp = NULL) {
  if(newpage)
    grid.newpage()
  if(is.null(vp)){
    grid.draw(x)
  } else {
    if (is.character(vp)) 
      seekViewport(vp)
    else pushViewport(vp)
    grid.draw(x)
    upViewport()
  }
  invisible(x)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多