如何在不首先将绘图映像写入磁盘(即直接从R环境)的情况下将其转换为base64编码?
注this演示了如何从图像文件中执行此操作。我无法使用文件,因为我只在一个只有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?
发布于 2020-04-23 08:01:40
您的a
对象,如您所识别的,不是一个实际的绘图,而是“来自绘图的原始数据”。严格地说,它代表了你想要描绘的东西,变量和元素之间的映射,以及所有的美学(主题、颜色等等)。尝试以下几点:
str(a, max.level=1)
(并一点一点地递增max.level
)。
当您在控制台中查看a
时,R实际上是在调用print(a)
--这就是如果您只是从命令行运行脚本,尝试通过调用a
本身来输出绘图的原因,这就是为什么您不会得到输出的原因。
当调用print(a)
(或从交互会话间接调用)时,ggplot2通过将变量映射到x-轴和y轴、颜色、映射出小面等来构建绘图。然后将结果绘制在图形设备上,无论是绘图窗口还是文件。实际上,您可以使用ggplotGrob
捕获此绘图的图形表示,然后在将其发送到屏幕或文件之前进一步操作实际绘图。
这有什么用?
您需要使用print(a)
而不是直接编码a
(正如您已经注意到的)。
例如,要生成一个base64 64编码的地块,您可以:
library(base64enc)
## convert image to base64 encoded string
fn <- tempfile(fileext='.png')
png(fn)
print(a)
dev.off()
base64enc::base64encode(fn)
但是:这确实要求您可以写入临时文件。老实说,我很难相信你被阻止了。
不幸的是,我不知道任何图形设备(png,bmp等)。是否可以直接写入内存流或变量,而不是物理文件。
发布于 2019-02-13 14:42:58
它似乎适用于来自某种类型的对象。当您使用ggplot()
时,对象的类与使用plot()
时不同。
class(a)
# [1] "gg" "ggplot"
class(my_plot)
# [1] "NULL"
为什么不一直使用ggplot()
呢?
my_ggplot <- ggplot(mapping = aes(x = 1:6, y = c(1,3,6,2,7,5))) + geom_point()
my_ggplot %>% base64Encode(.)
# [1] "bGlzdCgp"
# attr(,"class")
# [1] "base64"
https://stackoverflow.com/questions/54672663
复制相似问题