/ / Speichern Sie die ggplot2-Figur über rpy2 in einen Python-Puffer - python, python-3.x, ggplot2, rpy2

Speichern Sie die ggplot2-Figur über rpy2 in einen Python-Puffer - python, python-3.x, ggplot2, rpy2

Ich versuche, die Ausgabe eines zu speichern ggplot2 R Objekt erstellt mit rpy2 in einen von Python gesteuerten Puffer.

Ich kann das mit. Tun matplotlib aber ich kann es anscheinend nicht damit machen ggplot2 über rpy2.


Im matplotlib.pyplotDies kann erreicht werden mit:

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

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: Konvertierung "py2ri" nicht für Objekte vom Typ "" definiert

Ich habe versucht, das zu verwenden rpy2.robjects.lib.ggplot2.GGPlot.save Feature.

Antworten:

1 für die Antwort № 1

R "s ggplot2::ggsave erwartet eine Zeichenfolge, die einen Pfad (relativ oder absolut) als Argument für den Parameter angibt filename. Beispielsweise "/this/is/my/figure.png".

Ein Python BytesIO Objekt ist ganz anders. Es ist ein binärer In-Memory-Stream (grob gesagt Python-Objekt, das sich wie eine (binäre) Datei verhält).

Wenn Sie verwenden ggsave ist keine absolute Anforderung, in Betracht ziehen zu verwenden rpy2.robjects.lib.grdevices.render_to_bytesio(). Mit dieser Funktion werden folgende Inline-Figuren im Jupyter-Notizbuch angezeigt:

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