我写了一个名为gg()
. 它有 2 个 ggplots 相互叠加,因此我有 2 个 y 轴——一个在右边,另一个在左边。类似这已从如何管理 gtable() 的 t、b、l、r 坐标以正确绘制辅助 y 轴的标签和刻度线中共享
打印的最终对象是类的,gtable, grob
因为我使用gtable
,grid
包来完成此操作。
现在来解决问题:
我将此函数加载到一个包中,并在命名空间文件中专门导入了每个包中的所有函数,例如gtable
.etcgrid
和整个包ggplot2
。现在,在使用附加此包后,library()
我调用该函数gg()
。它会在 RStudio 中创建一个空白图,甚至在我第一次调用它的情况pdf()
下在 pdf 中创建。dev.off()
但如果我再次调用它,就会生成图。
当我独立调用相同的函数时,即不是通过加载包而是使用source()
单独加载函数文件然后调用gg()
,它甚至是第一次绘制。
我需要有关所有可能的原因/原因的帮助?
一世)。有没有人对对象有类似的问题gtable
?
您认为错误/错误的不同可能性是什么。我同意需要共享代码以便更好地理解。我将很快添加该函数的一个更简单的版本以及所需的任何其他细节。
编辑 1 :- 添加一个简单版本的 gg()
gg <- function(arg1, arg2, ...){
# let p1, p2 be a ggplot object(too big)
xx <- ggplot_build(p1)
yy <- ggplot_build(p2)
g1 <- ggplot_gtable(xx)
g2 <- ggplot_gtable(yy)
func1 <- function(grob){ # this function reverses the grobs
widths <- grob$widths
grob$widths[1] <- widths[3]
grob$widths[3] <- widths[1]
grob$vp[[1]]$layout$widths[1] <- widths[3]
grob$vp[[1]]$layout$widths[3] <- widths[1]
grob$children[[1]]$hjust <- 1 - grob$children[[1]]$hjust
grob$children[[1]]$vjust <- 1 - grob$children[[1]]$vjust
grob$children[[1]]$x <- unit(1, "npc") - grob$children[[1]]$x
return(grob)
}
pp <- c(subset(g1$layout, grepl("panel", g1$layout$name), se = t:r))
g <- gtable_add_grob(g1, g2$grobs[grepl("panel", g1$layout$name)],
pp$t, pp$l, pp$b, pp$l, name = "2ndpanel - ")
# inserts the 2nd y-axis label
index <- which(g2$layout$name == "ylab")
ylab <- g2$grobs[[index]]
ylab <- func1(ylab)
ylab$children[[1]]$rot <- ylab$children[[1]]$rot + 180
g <- gtable_add_cols(g, g2$widths[g2$layout[index, ]$l], pos = max(pp$r))
g <- gtable_add_grob(g,ylab, t = min(pp$t), l = max(pp$r)+1,
b = max(pp$b), r = max(pp$r)+1,
clip = "off", name = "2ndylab")
grid.draw(g)
if (newpage)
grid.newpage() # incase you want to have multiple pages of a pdf
我将在代码的倒数第二行解释“newpage”参数。这是用户传递的一个参数,告诉我想在同一个 pdf 中创建另一个绘图页面,该页面使用 pdf() 打开,并将在最后一个绘图后使用 dev.off() 关闭。在最后一个情节中,用户将通过 newpage = FALSE