2

这实际上是两个问题之一 - 要么:

1) 如何在向当前图形输出发送任何内容的情况下存储 print() 调用 [ie x <- print(something)]的结果?-或者-

2) ggplot 中是否有函数或方法可以存储对变量的 plot() 调用而不直接调用plot()ggplotGrob是在球场上,但一个ggplotGrob对象不会以与将结果存储到变量$data时相同的方式返回一个列表。print()

我正在使用从这个SO 答案中提取的技术来提取 geom_density 曲线的点,然后使用该数据生成一些注释。我在下面概述了这个问题——当我把它作为一个函数调用时,我在我的 pdf 中得到了不需要的中间图对象,以及最终图。目标是摆脱那个不受欢迎的情节;鉴于 basehist()有一个plot = FALSE选项,我希望对 R 视口有更多了解的人能够修复我的plot()调用(解决方案 #1),但坦率地说,任何解决方案都可以。

library(ggplot2)
library(plyr)

demo <- function (df) {
  p <- ggplot(
    df
   ,aes(
      x = rating
    )
  ) + 
  geom_density()

  #plot the object so we can access $data
  render_plot <- plot(p + ggtitle("Don't want this plot"))

  #grab just the DF for the density line
  density_df <- render_plot$data[[1]]

  #get the maximum density value
  max_y <- ddply(density_df, "group", summarise, y = max(y))

  #join that back to the data to find the matching row
  anno <- join(density_df, max_y, type = 'inner')

  #use this to annotate
  p <- p + annotate(
    geom = 'text'
   ,x = anno$x
   ,y = anno$y
   ,label = round(anno$density, 3)
  ) + 
  ggtitle('Keep this plot')

  return(p)
}

#call to demo outputs an undesired plot to the graphics device
ex <- demo(movies[movies$Comedy ==1,])

plot(ex)

#this is problematic if you are trying to make a PDF

  #a distinct name for the pdf to avoid filesystem issues
  unq_name <- as.character(format(Sys.time(), "%X"))
  unq_name <- gsub(':', '', unq_name)

pdf(paste(unq_name , '.pdf', sep=''))

  p <- demo(movies[movies$Drama ==1,])
  print(p)

dev.off()
4

1 回答 1

7

使用ggplot_build

render_plot <- ggplot_build(p + ggtitle("Don't want this plot"))
于 2013-07-10T17:55:20.420 回答