在R中,如何将绘图结果输出到内存缓冲区而不是文件中?

9

我正在使用JRI从Java生成ggplot2图表。目前,我必须将图表写入磁盘。如何在不通过文件的情况下完成这个过程,即只在内存中渲染图表?

我尝试使用Cairo包将绘图输出到textConnection,但这需要“R Connections Patch”,经过一些谷歌搜索,发现这已经过时了。


据我所知,目前还不可能实现。虽然这是一个经常被要求的功能,但我认为它需要对R的连接代码进行大量重构,因此迄今为止还没有完成。 - Richie Cotton
是的,R连接图已经成为历史(我写过它)。不过,我听说今年的useR会议有一些有趣的报告,称有人可能会在连接界面中偷偷加入一个小小的开口。 - Jeff
1
此外,有一种未记录的方法可以从Cairo设备中获取原始图像数据。只是需要有人为它编写转换器,无论是png、jpeg、tiff等格式。您将不得不阅读源代码,但是可以在rforge.net上的Cairo包中查看.image函数。 - Jeff
@Jeff:你的提示让我找到了答案。正在发布。 - Yang
1个回答

12

主要来源于https://stat.ethz.ch/pipermail/r-devel/2010-August/058253.html

library(Cairo)
library(png)
library(ggplot2)

Cairo(file='/dev/null')

qplot(rnorm(5000)) # your plot

# hidden stuff in Cairo
i = Cairo:::.image(dev.cur())
r = Cairo:::.ptr.to.raw(i$ref, 0, i$width * i$height * 4)
dim(r) = c(4, i$width, i$height) # RGBA planes
# have to swap the red & blue components for some reason
r[c(1,3),,] = r[c(3,1),,]
# now use the png library
p = writePNG(r, raw()) # raw PNG bytes

[更新:JRI可以处理原始数据,只需使用REngine抽象而不是JRI即可。]


杨,太棒了!我不知道Simon写了这样一个包!感谢你的回答。 - Jeff
干得好。你知道@Yang,这种方法是否有PDF等效方法吗? - geotheory
@gottheory 请提出问题,我将发布此解决方案 https://www.andrewheiss.com/blog/2016/12/08/save-base-graphics-as-pseudo-objects-in-r/ 不幸的是,png(NULL)不起作用。 - Hedgehog
这看起来非常棒,但大约三分之一的时间,不一致地,它会生成一个全灰色的“图像”。我知道绘制内存的另一个选项是使用magick;还有其他的吗? - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接