我写了一个名为gg()
的函数(没有共享代码)。它有2个ggplots叠加在一起,这样我就有2个y轴 - 一个在右边,另一个在左边。像这样的内容已经从How to manage the t, b, l, r coordinates of gtable() to plot the secondary y-axis's labels and tick marks properly
打印的最终对象属于gtable, grob
类,因为我使用了gtable
,grid
个包来完成此任务。
现在出现问题:
我将此函数加载到一个包中,并且在命名空间文件中,我专门导入了每个包中的所有函数,如gtable
,grid
等以及整个ggplot2
包。现在使用library()
附加此包后,我调用函数gg()
。它会在RStudio中创建一个空白的图,如果在我第一次调用pdf()
和dev.off()
时使用pdf。但是,如果我再次调用它,则会生成绘图。
当我独立调用相同的函数时,即不是通过加载包而是使用source()
单独加载函数文件然后调用gg()
,它甚至是第一次绘制。
我想要了解所有可能原因/原因的帮助?
i)中。是否有人与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
我将解释&#34; newpage&#34;代码的倒数第二行中的参数。这是一个用户传递的参数,告诉我想要在使用pdf()打开的相同pdf中创建另一个绘图页面,并在最后一个使用dev.off()的绘图后关闭。在最后一个图中,用户将传递newpage = FALSE