这实际上是两个问题之一 - 要么:
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()