用pdf绘制grid / ggplot2 + base给出空白的第一页(控制图宽度)

问题描述 投票:3回答:2

我想在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()

情节看起来像:

enter image description here

r ggplot2 base r-grid
2个回答
4
投票

你可能会对gridGraphics包有更好的运气,尽管事情也不是很完美,

enter image description here

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()
© www.soinside.com 2019 - 2024. All rights reserved.