首页 > 解决方案 > 如何在不先将图像文件读/写到磁盘的情况下将简单的 R 绘图图像转换为 base64 编码?

问题描述

如何将绘图图像转换为 base64 编码而不先将其写入磁盘(即直接从 R 环境中)?

请注意,这显示了如何从图像文件中执行此操作。我无法使用文件,因为我在仅带有 R 解释器的环境中运行它(即仅临时存储)

我试过base64Encode()这样使用

library(ggplot2)
library(dplyr)
df <- data.frame(
  gp = factor(rep(letters[1:3], each = 10)),
  y = rnorm(30)
)
ds <- plyr::ddply(df, "gp", plyr::summarise, mean = mean(y), sd = sd(y))

a <- ggplot(df, aes(gp, y)) +
  geom_point() +
  geom_point(data = ds, aes(y = mean), colour = 'red', size = 3) 

library(RCurl)
a %>% base64Encode(.)

但这只是将底层绘图数据(而不是图像本身)转换为 base64。

如何将图像从 R 环境转换为 base64?

标签: rggplot2base64

解决方案


正如您所确定的,您的a对象不是实际的情节,而是“情节中的原始数据”。严格来说,它代表了您想要绘制的内容、变量和元素之间的映射以及所有美学(主题、颜色等)。尝试以下操作:

str(a, max.level=1)

max.level(并逐位递增)。

当您a在控制台中查看时,R 实际上是在调用print(a)- 这就是为什么如果您只是从命令行运行脚本并尝试a通过自身调用来输出绘图,则不会输出绘图。

当调用print(a)(或间接从交互式会话中调用)时,ggplot2 通过将变量映射到 x 轴和 y 轴、颜色、映射刻面等来构建绘图。然后在图形设备上绘制结果绘图窗口或文件。在将其发送到屏幕或文件之前,您实际上可以捕获此图形的图形表示,ggplotGrob然后进一步操作实际图形。

这有什么帮助?

您需要使用print(a)而不是直接编码a(如您所见)。

即产生一个base64编码的情节,你可以这样做:

library(base64enc)
## convert image to base64 encoded string

fn <- tempfile(fileext='.png')
png(fn)
print(a)
dev.off()

base64enc::base64encode(fn)

但是:这确实要求您可以写入临时文件。老实说,我很难相信你会被阻止。

不幸的是,我不知道任何图形设备(png、bmp 等)是否可以直接写入内存流或变量而不是物理文件。


推荐阅读