0

我正在尝试编写一个小实用函数来注释我的情节Reuben Fischer-Baum 风格,底部有一个漂亮的小徽标和 url - 例如:

我已经想出了如何将 postscript 文件加载到 R 中;它证明了情节底部的图像让我发疯。我无法pictureGrob左对齐;充其量我可以让它在我的情节的左侧居中,但是我的图像的一半被切断了,就像下面这个可重现的例子:

通过限制 周围的缓冲区,修改width设置可以近似于我想要完成的任务pictureGrob,但我认为,我真正想要的是在其视口内左对齐图片本身,或者使视口完全贴合图片。[Paul Murrell 在第 3 页做了类似的事情。网格书的162,但这似乎取决于一个stringWidth没有图片伙伴的实用函数(?)]

我问过一个关于gridextra tables的类似问题,但正如 baptiste 在那里评论的那样,“在网格中处理对齐总是相当尴尬”。

任何帮助表示赞赏;指向任何关于网格中正当理由发生的概念性讨论的指针将是壮观的。

可重现的代码(注意grImport需要安装 ghostscript):

require(grImport)
require(ggplot2)
require(gridExtra)

#nb: you also need ghostscript installed on your machine.
#I had a hell of a time getting ghostscript to work properly.  
#From the bowels of a R mailing list, I found this helpful tip 
#from Paul Murrell himself:
#https://www.mail-archive.com/r-help@r-project.org/msg203180.html

#YMMV, THIS WORKED ON MY MACHINE:
  #gswin <- shortPathName("C:/Program Files/gs/gs9.15/bin/gswin64c.exe")
  #Sys.setenv(R_GSCMD = gswin)


#get a fun little moon
PostScriptTrace(
  file=file.path(system.file(package = "RGraphics"), "extra", "comic_moon.ps"),
  outfilename="comic_moon.xml")
moon <- readPicture("comic_moon.xml")


annotate_me <- function(
  plot_to_annotate,
  some_picture,
  bg_color="gray30"
) {

  #make a gTree
  foo <- gTree(
    children=gList(
      rectGrob(gp=gpar(fill=bg_color)),
      pictureGrob(
        picture=some_picture,
        x=0, y=0.5,
        #width=?
      )
    )
  )

  final <- arrangeGrob(
    plot_to_annotate, foo,
    nrow=2, heights=c(19,1)
  )

  return(final)
}


annotate_me(
  plot_to_annotate=qplot(mpg, data=mtcars),
  some_picture=moon
)
4

1 回答 1

3

我相信没有为pictureGrob 实现widthDetails,所以理由是随机的。

这是一种方法:定义对象的宽度,并将其放置在 x = 0.5 宽度处。

在此处输入图像描述

require(grImport)
hourglass <- new("Picture",
                 paths= list(new("PictureFill",
                                 x=c(0, 1, 0, 1),
                                 y=c(0, 0, 1, 1))),
                 summary= new("PictureSummary",
                              numPaths=1,
                              xscale=c(0, 1),
                              yscale=c(0, 1)))

g1 <- pictureGrob(hourglass, use.gc=FALSE,x=unit(1,"line"),
                  width=unit(2,"line"), gp=gpar(fill="red"))
library(ggplot2)
library(gtable)
library(dplyr)

p <- qplot(1,1)
g <- ggplotGrob(p) 

grid.newpage()
g %>%
  gtable_add_rows(unit(2,"lines")) %>%
  gtable_add_grob(rectGrob(gp=gpar(fill="grey")), name="border",
                  t=nrow(g)+1,l=1,r=ncol(g)) %>%
  gtable_add_grob(g1, t=nrow(g)+1,l=1,r=ncol(g)) %>%
  gtable_add_grob(textGrob("text here", x=1, hjust=1, gp=gpar(col="white")),
                  name = "text", t=nrow(g)+1,l=1,r=ncol(g)) %>%
  grid.draw
于 2014-10-15T18:25:05.813 回答