使用 rpy2 to return 图像数据从 R 到 Python

Using rpy2 to return image data from R to Python

我在 R 中创建绘图,但随后尝试将生成的图像数据 return 转换为 Python,以便 Python 可以显示图像。

在 R 中,我使用 magickhold the image in memory(而不是绘制到屏幕上)。

"We use image_write to export an image in any format to a file on disk, or in memory if path = NULL"

我不确定如何处理由 rpy2 编辑为 Python 的 SexpExtPtrByteVector 类型。

import rpy2.robjects as ro

r = ro.r

r('''
    library("magick")
    figure <- image_graph(width = 400, height = 400, res = 96)
    plot(c(1,2,3))
    image <- image_write(figure, path = NULL, format = "png")
    # image_write(figure, path = 'example.png', format = 'png')
''')

figure = ro.globalenv['figure']
image = ro.globalenv['image']

im = Image.open(BytesIO(image))

上面的代码给我错误:

Traceback (most recent call last):
  File "Whosebug.py", line 23, in <module>
    im = Image.open(BytesIO(image))
TypeError: a bytes-like object is required, not 'ByteVector'

在Python中:

所以...事实证明 <class 'rpy2.robjects.vectors.ByteVector'> 是一个可迭代对象,我可以使用 bytes() 构造一个字节数组。

此外,通过将代码放入使用 return 到 return PIL 图像的函数中,我可以让图像显示在 Jupyter 笔记本中(或者我们可以只做 image.show())

from io import BytesIO

import PIL.Image as Image
import rpy2.robjects as ro

def main():
    r = ro.r

    r('''
        library("magick")
        figure <- image_graph(width = 400, height = 400, res = 96)
        plot(c(1,2,3))
        image <- image_write(figure, path = NULL, format = "png")
        image_write(figure, path = 'example.png', format = 'png')
    ''')

    image_data = ro.globalenv['image']

    image = Image.open(BytesIO(bytes(image_data)))

    return image


if __name__ == '__main__':
    image = main()
    image.show()