微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用rpy2将图像数据从R返回到Python

如何解决使用rpy2将图像数据从R返回到Python

我正在R中创建绘图,但随后尝试将生成的图像数据返回给Python,以便Python可以显示图像。

在R中,我已将magick库用于hold the image in memory(而不是绘制到屏幕上)。

“我们使用image_write将任何格式的图像导出到磁盘上的文件中,或者如果有path = NULL则导出到内存中的文件中”

我不确定如何处理SexpExtPtr返回给Python的ByteVectorrpy2类型。

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 "stackoverflow.py",line 23,in <module>
    im = Image.open(BytesIO(image))
TypeError: a bytes-like object is required,not 'ByteVector'

在Python中:

  • figure的类型为<class 'rpy2.rinterface.SexpExtPtr'>
  • image的类型为<class 'rpy2.robjects.vectors.ByteVector'>

解决方法

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

此外,通过将代码放在使用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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。