ggplot + gtable对象在调用时第一次给出空白图,但后来成功地绘制了

时间:2016-09-18 19:58:00

标签: r ggplot2 gtable

我写了一个名为gg()的函数(没有共享代码)。它有2个ggplots叠加在一起,这样我就有2个y轴 - 一个在右边,另一个在左边。像thanks to Sandy Muspratt for the reference这样的内容已经从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类,因为我使用了gtablegrid个包来完成此任务。

现在出现问题:

我将此函数加载到一个包中,并且在命名空间文件中,我专门导入了每个包中的所有函数,如gtablegrid等以及整个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

0 个答案:

没有答案