2016-11-14 40 views
1

使用ggplotshiny,并绘制大量数据以生成一些交互式图。缓存ggplot2图的方法

我有一些性能问题,所以我用benchplot()检查了我的绘图时间,一些大的情节很慢。例如,这是我花了绘制那些plots-

 step user.self sys.self elapsed 
1 construct  0.093 0.005 0.101 
2  build  1.528 0.044 1.583 
3 render  3.292 0.070 3.446 
4  draw  3.102 0.189 3.521 
5  TOTAL  8.015 0.308 8.651 

我不能ggvisggbio绘制的一个时间,因为他们没有刻面,这是必不可少的。

有没有办法缓存构图,构建和渲染的情节,所以我只需要画出它的问题,并可以节省一半的时间?

(保存图片的可能性也不大,因为情节是互动)

+0

你能否提供[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610)? – timat

+0

我想过了,但它确实没有道理。我的问题不是关于任何具体的数据,而是关于是否有任何方法缓存中间的情节进度。 –

+2

一个可重复的例子总是有意义的。请注意我如何在我的答案中创建一个。 – Roland

回答

3

是的,有:

p <- ggplot(iris, (aes(x = Species, y = Sepal.Length))) + 
    geom_boxplot() 

g <- ggplotGrob(p) 
library(grid) 
grid.newpage() 
grid.draw(g) 


system.time(print(p)) 
#user system elapsed 
#0.11 0.00 0.11 


system.time({ 
    grid.newpage() 
    grid.draw(g) 
    }) 
#user system elapsed 
#0.03 0.00 0.03 

但是,如果你创建正确的情节也可以考虑。例如,如果您绘制了数十万个点,则您正在创建一个包含大量重叠绘图的图。

+0

谢谢! 你的建议是一个很好的开始,它节省了构建时间。 有没有办法做同样的建设/渲染? (需要更多时间) 我不确定是否有可能,我甚至不明白每一步是什么,试图找到一些信息,但没有成功。 –

+0

不,我认为这在网格图形系统中是不可能的。如果这些步骤需要很长时间,请参阅我的答案中的最后一句话。 – Roland

+0

谢谢! 我看到你写的东西,我不认为我在使用错误的情节,但它确实让我想到了将它分成2个不同的情节的方法,每个情节都小得多..现在就试试它。 –