感谢 "Combine a ggplot2 object with a lattice object in one plot" 中的出色回答和一些进一步的想法,我可以在 lattice 旁边绘制一个 ggplot 图:

library(ggplot2)
library(lattice)
library(gtools)
library(plyr)
library(grid)
library(gridExtra)

set.seed(1)
mdat <- data.frame(x = rnorm(100), y = rnorm(100), veryLongName = rnorm(100),
                   cluster = factor(sample(5, 100, TRUE)))
cols <- c("x", "y", "veryLongName")
allS <- adply(combinations(3, 2, cols), 1, function(r)
    data.frame(cluster = mdat$cluster,
          var.x = r[1],
          x = mdat[[r[1]]],
          var.y = r[2],
          y = mdat[[r[2]]]))

sc <- ggplot(allS, aes(x = x, y = y, color = cluster)) + geom_point() +
      facet_grid(var.x ~ var.y) + theme(legend.position = "top")
sc3d <- cloud(veryLongName ~ x + y, data = mdat, groups = cluster)

scG  <- ggplotGrob(sc)
sc3dG <- gridExtra:::latticeGrob(sc3d)
ids <- grep("axis-(l|b)-(1|2)|panel", scG$layout$name)
scG$grobs[ids[c(2, 5, 8)]] <- list(nullGrob(), nullGrob(), nullGrob())
grid.newpage()
grid.draw(scG)
pushViewport(viewport(0, 0, width = .515, height = .46,
                      just = c("left", "bottom")))
grid.rect()
grid.draw(sc3dG)

正如您在图片中所看到的,格子图周围有相当多的边距,在它的顶部,z 轴的轴标签被切割(我单独绘制 lattice 图时情况并非如此)。

那么我怎样才能摆脱这种行为,从而解决以下两个问题:
  • 去掉 viewportlattice 图之间的内边距
  • 避免切割 lattice 图中的标签。

  • 我尝试使用 clipviewport 选项,但没有成功。那么该怎么办?

    2020 年更新

    编辑代码和答案以反射(reflect) Grob 中的新命名约定。

    从点阵图中删除内部边距-LMLPHP
    从点阵图中删除内部边距-LMLPHP

    最佳答案

    这些设置可能在 ?xyplot 的某个地方,但我发现阅读互联网更快,

    从点阵图中删除内部边距-LMLPHP

    theme.novpadding <-
      list(layout.heights =
             list(top.padding = 0,
                  main.key.padding = 0,
                  key.axis.padding = 0,
                  axis.xlab.padding = 0,
                  xlab.key.padding = 0,
                  key.sub.padding = 0,
                  bottom.padding = 0),
           axis.line = list(col = 0),
           clip =list(panel="off"),
           layout.widths =
             list(left.padding = 0,
                  key.ylab.padding = 0,
                  ylab.axis.padding = 0,
                  axis.key.padding = 0,
                  right.padding = 0))
    
    
    sc3d <- cloud(veryLongName ~ x + y, data = mdat, groups = cluster,
                  par.settings = theme.novpadding )
    
    scG  <- ggplotGrob(sc)
    sc3dG <- grobTree(gridExtra:::latticeGrob(sc3d),
                      rectGrob(gp=gpar(fill=NA,lwd=1.2)))
    ids <- grep("axis-(l|b)-(1|2)|panel", scG$layout$name)
    scG$grobs[ids[c(5, 2, 8)]] <- list(nullGrob(), sc3dG, nullGrob())
    grid.newpage()
    grid.draw(scG)
    

    关于从点阵图中删除内部边距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32332580/

    10-12 14:04