如何解决使用rpy2将图像数据从R返回到Python
我正在R中创建绘图,但随后尝试将生成的图像数据返回给Python,以便Python可以显示图像。
在R中,我已将magick
库用于hold the image in memory(而不是绘制到屏幕上)。
“我们使用
image_write
将任何格式的图像导出到磁盘上的文件中,或者如果有path = NULL
则导出到内存中的文件中”
我不确定如何处理SexpExtPtr
返回给Python的ByteVector
或rpy2
类型。
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 举报,一经查实,本站将立刻删除。