1

我写了一个名为gg(). 它有 2 个 ggplots 相互叠加,因此我有 2 个 y 轴——一个在右边,另一个在左边。类似感谢 Sandy Muspratt 的参考这已从如何管理 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

4

0 回答 0