/ / Uložiť obrázok ggplot2 cez rpy2 do vyrovnávacej pamäte Pythonu - python, python-3.x, ggplot2, rpy2

Uložte obrázok ggplot2 cez rpy2 do vyrovnávacej pamäte Pythonu - python, python-3.x, ggplot2, rpy2

Snažím sa zachrániť výstup a ggplot2 R objekt vytvorený pomocou rpy2 do vyrovnávacej pamäte riadenej spoločnosťou Python.

Som schopný to urobiť pomocou matplotlib ale nemôžem to robiť ggplot2 via rpy2.


v matplotlib.pyplot, toto sa dá dosiahnuť:

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

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

Chyba:

NotImplementedError: Konverzia "py2ri" nie je definovaná pre objekty typu ""

Snažil som sa použiť rpy2.robjects.lib.ggplot2.GGPlot.save vlastnosť.

odpovede:

1 pre odpoveď č. 1

R "je ggplot2::ggsave očakáva reťazec, ktorý špecifikuje cestu (relatívna alebo absolútna) ako parameter parametra filename, Napríklad "/this/is/my/figure.png".

Python BytesIO objekt je úplne iný. Je to binárny tok v pamäti (zhruba objekt Pythonu, ktorý sa správa ako súbor (binárny)).

Ak používate ggsave nie je absolútnou požiadavkou, zvážte použitie rpy2.robjects.lib.grdevices.render_to_bytesio(), Toto je funkcia, ktorá vytvára nasledujúce inline obrázky v notebooku Jupyter:

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