Frage

Ich bin mit rpy2-2.0.7 (Ich muss das Arbeiten mit Windows 7 und für die neueren Versionen rpy2 die Binärdateien zu kompilieren, ist ein Chaos) eine zweispaltige Datenrahmen in r schieben, ein paar Schichten in ggplot2 erstellen und gibt das Bild in ein <.png>.

Ich habe unzählige Stunden verschwendet mit der Syntax fidgeting um; ich habe die Ausgabe verwalten die Dateien, die ich an einem Punkt benötigt, aber (dummerweise) gar nicht bemerkt und fuhr fort mit meinem Code ...

fidgeting um

würde ich aufrichtig danken Ihnen für jede Hilfe; ist ein (triviales) Beispiel zur Demonstration. Vielen Dank für Ihre Hilfe!!! ~ Eric Butter


import rpy2.robjects as rob
from rpy2.robjects import r
import rpy2.rlike.container as rlc
from array import array

r.library("grDevices")    # import r graphics package with rpy2
r.library("lattice")
r.library("ggplot2")
r.library("reshape")

picpath = 'foo.png' 

d1 = ["cat","dog","mouse"]
d2 = array('f',[1.0,2.0,3.0])

nums = rob.RVector(d2)
name = rob.StrVector(d1)

tl = rlc.TaggedList([nums, name], tags = ('nums', 'name'))
dataf = rob.RDataFrame(tl)

## r['png'](file=picpath, width=300, height=300)
## r['ggplot'](data=dataf)+r['aes_string'](x='nums')+r['geom_bar'](fill='name')+r['stat_bin'](binwidth=0.1)
r['ggplot'](data=dataf)
r['aes_string'](x='nums')
r['geom_bar'](fill='name')
r['stat_bin'](binwidth=0.1)
r['ggsave']()
## r['dev.off']()

* Die Ausgabe ist nur ein leeres Bild (181 b).


Hier sind ein paar häufigen Fehler R selbst wirft, als ich um Geige in ggplot2:

r['png'](file=picpath, width=300, height=300)
r['ggplot']()
r['layer'](dataf, x=nums, fill=name, geom="bar")
r['geom_histogram']()
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

* RRuntimeError: Fehler: Keine Schichten in Handlung

r['png'](file=picpath, width=300, height=300)
r['ggplot'](data=dataf)
r['aes'](geom="bar")
r['geom_bar'](x=nums, fill=name)
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

* RRuntimeError: Fehler: Wenn Einstellung Ästhetik, können sie nur einen Wert nehmen. Probleme: Füllung, x

War es hilfreich?

Lösung

Ich verwende rpy2 allein durch Nathaniel Smith brillante kleine Modul namens rnumpy (siehe " API“Link am rnumpy Homepage). Mit diesem können Sie tun:

from rnumpy import *

r.library("ggplot2")

picpath = 'foo.png' 
name = ["cat","dog","mouse"]
nums = [1.0,2.0,3.0]

r["dataf"] = r.data_frame(name=name, nums=nums)
r("p <- ggplot(dataf, aes(name, nums, fill=name)) + geom_bar(stat='identity')")
r.ggsave(picpath)

(Ich vermute, ein wenig darüber, wie Sie den Plot zu sehen möchten, aber Sie bekommen die Idee.)

Ein weiterer großer Komfort „R-Modus“ von Python mit dem ipy_rnumpy Modul eintritt. (Siehe "IPython Integration" Link am rnumpy Homepage).

Bei komplizierten Sachen, ich in der Regel in R Prototyp bis ich die Plottbefehle erarbeitet. Fehlerberichterstattung in rpy2 oder rnumpy kann ziemlich chaotisch.

Zum Beispiel das Ergebnis einer Zuweisung (oder eine andere Berechnung) wird manchmal auch gedruckt, wenn sie unsichtbar sein soll. Dies ist ärgerlich, z.B. bei der Zuordnung zu großen Datenrahmen. Eine schnelle Abhilfe ist, die Codezeile mit einer Hinter Aussage, dass auswertet, um etwas kurz zu beenden. Zum Beispiel:

In [59] R> long <- 1:20
Out[59] R>
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20

In [60] R> long <- 1:100; 0
Out[60] R> [1] 0

(Um einige wiederkehrenden Warnungen in rnumpy zu Schweigen, ich habe bearbeitet rnumpy.py hinzufügen ‚von Warnungen importieren warnen‘ und ersetzen ‚print‚Fehler in process_revents: ignoriert‘‘ mit ‚warnen (‚Fehlern in process_revents: ignoriert‘ ‚). Auf diese Weise, ich sehe nur die Warnung einmal pro Sitzung).

Andere Tipps

Sie haben die Entwickler () zu ergreifen, bevor Sie es abgeschaltet wird, was bedeutet, dass Sie drucken müssen () (wie JD oben errät) vor dem Werfen dev.off ().

from rpy2 import robjects                          
r = robjects.r                                                                                    
r.library("ggplot2")
robjects.r('p = ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()') 
r.ggsave('/stackBar.jpeg') 
robjects.r('print(p)')
r['dev.off']()

Um es etwas einfacher, wenn Sie komplexere Diagramme zeichnen:

from rpy2 import robjects
from rpy2.robjects.packages import importr
import rpy2.robjects.lib.ggplot2 as ggplot2
r = robjects.r
grdevices = importr('grDevices')
p = r('''
  library(ggplot2)

  p <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
  p <- p + opts(title = "{0}")
    # add more R code if necessary e.g. p <- p + layer(..)
  p'''.format("stackbar")) 
  # you can use format to transfer variables into R
  # use var.r_repr() in case it involves a robject like a vector or data.frame
p.plot()
# grdevices.dev_off()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top