使用 rpy2 to return 图像数据从 R 到 Python
Using rpy2 to return image data from R to Python
我在 R 中创建绘图,但随后尝试将生成的图像数据 return 转换为 Python,以便 Python 可以显示图像。
在 R 中,我使用 magick
库 hold 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 的 SexpExtPtr
或 ByteVector
类型。
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中:
figure
的类型为 <class 'rpy2.rinterface.SexpExtPtr'>
image
的类型为 <class 'rpy2.robjects.vectors.ByteVector'>
所以...事实证明 <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()
我在 R 中创建绘图,但随后尝试将生成的图像数据 return 转换为 Python,以便 Python 可以显示图像。
在 R 中,我使用 magick
库 hold the image in memory(而不是绘制到屏幕上)。
"We use
image_write
to export an image in any format to a file on disk, or in memory ifpath = NULL
"
我不确定如何处理由 rpy2
编辑为 Python 的 SexpExtPtr
或 ByteVector
类型。
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中:
figure
的类型为<class 'rpy2.rinterface.SexpExtPtr'>
image
的类型为<class 'rpy2.robjects.vectors.ByteVector'>
所以...事实证明 <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()