通过 rpy2 将 ggplot2 图保存到 Python 缓冲区中

Save ggplot2 figure via rpy2 into a Python buffer

我正在尝试将使用 rpy2 创建的 ggplot2 R 对象的输出保存到由 Python 控制的缓冲区中。

我可以使用 matplotlib 来做到这一点,但我似乎无法通过 rpy2.

使用 ggplot2 来做到这一点

matplotlib.pyplot 中,这可以通过以下方式完成:

import matplotlib.pyplot as plt
import io
import numpy

def test_save():
    x = numpy.linspace(-5, 5)
    y = 3*x + 2
    fig = plt.figure()
    plt.plot(x, f)
    buf = io.BytesIO()
    plt.savefig(buf, format = 'png')
    return buf

ggplot2 尝试:

import io
import numpy   
import rpy2.robjects as robjects
from pandas import DataFrame
import rpy2.robjects.lib.ggplot2 as ggplot2


def test_ggplot2_save():

    x = numpy.linspace(-5, 5)
    y = 3*x + 2
    df = DataFrame({'x': x, 'y': y})

    gp = ggplot2.ggplot(df)
    pp = (gp 
      + ggplot2.aes_string(x='x', y='y')
      + ggplot2.geom_point()
      + ggplot2.labs(title="MY DATA", x='x', y='y'))
    # pp.plot()

    buf = io.BytesIO()

    robjects.r.ggsave(filename=buf, plot=pp, width=200, height=120, unit='mm')

错误:

NotImplementedError: Conversion 'py2ri' not defined for objects of type ''

我正在尝试使用 rpy2.robjects.lib.ggplot2.GGPlot.save 功能。

R 的 ggplot2::ggsave 需要指定路径(相对或绝对)的字符串作为参数 filename 的自变量。例如 "/this/is/my/figure.png".

一个PythonBytesIO对象是完全不同的。它是内存中的二进制流(大致 Python 对象,其行为类似于(二进制)文件)。

如果使用 ggsave 不是绝对要求,请考虑使用 rpy2.robjects.lib.grdevices.render_to_bytesio()。这是使以下在 Jupyter 笔记本中显示内联图形的函数:

from rpy2.ipython.ggplot import image_png
# pp is your ggplot2 figure
display(image_png(pp))