Pregunta

Estoy utilizando rpy2-2.0.7 (i necesito esto para trabajar con Windows 7, y la compilación de los binarios para las versiones más recientes rpy2 es un desastre) para empujar una trama de datos de dos columnas en r, crear unas pocas capas en ggplot2 , y la salida de la imagen en un <.png>.

He perdido innumerables horas inquietas alrededor con la sintaxis; Me las arreglé para dar salida a los archivos que necesitaba en un momento, pero (estúpidamente) no se dio cuenta y siguió jugueteando un poco con mi código ...

i agradecería sinceramente cualquier ayuda; a continuación es un ejemplo (trivial) para la demostración. ¡¡¡Muchas gracias por su ayuda!!! ~ 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']()

* La salida es sólo una imagen en blanco (181b).


aquí hay errores comunes pareja R tiros en sí, ya que el violín alrededor de 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: Error: No hay capas en parcela

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: Error: Cuando ajuste la estética, que sólo pueden tener un valor. Problemas: relleno, x

¿Fue útil?

Solución

Yo uso rpy2 únicamente a través del módulo brillante poco de Nathaniel Smith llamado rnumpy (ver el " API liga", en la página principal de rnumpy). Con esto se puede hacer:

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)

(supongo que un poco acerca de cómo desea que la trama de aspecto, pero se entiende la idea.)

Otra gran comodidad está entrando en "modo R" de Python con el módulo ipy_rnumpy. (Vea el enlace de "integración IPython" en la página de inicio rnumpy).

Para la materia complicada, por lo general prototipo en I hasta que haya los comandos de trazado elaborado. el informe de errores en rpy2 o rnumpy puede llegar a ser muy desordenado.

Por ejemplo, el resultado de una asignación (u otro cálculo) a veces se impreso incluso cuando debería ser invisible. Esto es molesto, por ejemplo, cuando se asignan a tramas de datos de gran tamaño. Una solución rápida es poner fin a la línea en cuestión con una declaración de salida que da como resultado algo corto. Por ejemplo:

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

rnumpy.py (Para silenciar algunas advertencias recurrentes en rnumpy, he editado para añadir 'de advertencias importar advertir' y reemplazar ' 'error en process_revents: ignorado' imprimir' con 'advertir ( 'error en process_revents: ignorado' )'. De esta manera, sólo ver el aviso una vez por sesión.)

Otros consejos

Usted tiene que participar el dev () antes de apagarlo, lo que significa que usted tiene que imprimir () (como JD adivina arriba) antes de lanzar 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']()

Para que sea un poco más fácil cuando se tiene que dibujar parcelas más complejas:

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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top