【问题标题】:Plot grid/ggplot2 + base with pdf gives blank first page (control plot widths)Plot grid/ggplot2 + base with pdf 给出空白的第一页(控制绘图宽度)
【发布时间】:2016-02-16 03:14:06
【问题描述】:

我想在pdf 输出的同一图中绘制一个网格和基本图。我看到了如何在几个地方添加网格加基地,包括这里:Combining grid.table and base package plots in R figureR put together traditional plot and ggplot2

我还想使用比例或相对宽度来控制绘图的宽度。我以为我有下面的代码,我试图输出到 pdf,然后它在情节之前打印一个空白页。我怎样才能让它不绘制空白页?我没有嫁给任何包,我只是希望答案可以概括(简单是加分;我觉得下面的代码可以简化)。

library(ggplot2); library(grid); library(gridBase)

pdf("test.pdf")

grid::grid.newpage()
grid::pushViewport(grid::viewport(layout = grid::grid.layout(1, ncol=2,
    widths = grid::unit(c(.6, .4), "npc"))))

#Draw base plot
grid::pushViewport(grid::viewport(layout.pos.col = 1, width = grid::unit(.8, "npc")))

graphics::plot.new()
graphics::par(fig = gridBase::gridFIG(), mar=c(1, 1, 1, 1), new = TRUE)


plot(1:10)

grid::popViewport()

#Draw ggplot
grid::pushViewport(grid::viewport(layout.pos.col = 2, width = grid::unit(.2, "npc")))
print( ggplot(mtcars, aes(mpg, hp)) + geom_point(), newpage = FALSE)
grid::popViewport()

dev.off()

剧情如下:

【问题讨论】:

  • 罪魁祸首似乎在gridBase::gridFIG() 中,它又调用gridBase:::currentViewportLoc(),其中包含诸如width <- convertWidth(unit(1, "npc"), "inches", valueOnly = TRUE) 之类的调用,已知这些调用会触发不需要的新页面。也许您可以通过使用自定义版本的 gridFIG 来避免它,而不是进行这些转换,而是使用 par(din) 之类的东西。

标签: r ggplot2 base r-grid


【解决方案1】:

使用 gridGraphics 包可能会更好,虽然事情也不是完全顺利,

library(gridGraphics)

grab_grob <- function(){
  grid.echo(newpage=TRUE)
  grid.grab()
}

par(mar=c(4,6,1,1)) # for some reason need lots of space
plot(1:10)
bg <- grab_grob()
p <- ggplot(mtcars, aes(mpg, hp)) + geom_point()

ggsave("test.pdf", gridExtra::arrangeGrob(bg, p, widths = c(2,1)))

【讨论】:

    【解决方案2】:

    这是一种删除@baptiste 指出的问题的gridBase::gridFIG 的方法。我伪造了宽度。

    library(ggplot2); library(grid); library(gridBase)
    
    pdf("test.pdf")
    
    widths <- c(.335, .665)
    widths <- 100*round(widths/sum(widths), 2)
    
    layout(matrix(c(rep(1, widths[1]), rep(2, widths[2])), nrow = 1,  byrow = TRUE))
    
    #Draw base plot
    plot.new()
    graphics::par(mar=c(1, 1, 1, 1), new = TRUE)
    
    plot(1:10)
    
    #Draw ggplot
    plot.new()
    vps <- baseViewports()
    print( ggplot(mtcars, aes(mpg, hp)) + geom_point(), vp = vpStack(vps$figure,vps$plot))
    
    dev.off()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多