/ / Guardar la figura ggplot2 a través de rpy2 en un búfer de Python - python, python-3.x, ggplot2, rpy2

Guarde la figura de ggplot2 a través de rpy2 en un búfer de Python: python, python-3.x, ggplot2, rpy2

Estoy tratando de guardar la salida de un ggplot2 R objeto creado usando rpy2 en un búfer controlado por Python.

Soy capaz de hacer esto usando matplotlib pero parece que no puedo hacerlo con ggplot2 vía rpy2.


En matplotlib.pyplot, esto se puede lograr con:

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 intento:

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")

Error:

NotImplementedError: Conversión "py2ri" no definida para objetos de tipo ""

Estaba tratando de usar el rpy2.robjects.lib.ggplot2.GGPlot.save característica.

Respuestas

1 para la respuesta № 1

R "s ggplot2::ggsave está esperando una cadena que especifica una ruta (relativa o absoluta) como un argumento para el parámetro filename. Por ejemplo "/this/is/my/figure.png".

Un pitón BytesIO El objeto es bastante diferente. Es un flujo binario en memoria (aproximadamente un objeto de Python que se comporta como un archivo (binario)).

Si usa ggsave no es un requisito absoluto, considera usar rpy2.robjects.lib.grdevices.render_to_bytesio(). Esta es la función que hace que se muestren las siguientes figuras en línea en el cuaderno Jupyter:

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