Question

J'utilise rpy2-2.0.7 (j'ai besoin que cela fonctionne avec Windows 7 et les binaires pour compiler les versions plus récentes rpy2 est un gâchis) pour pousser une trame de données à deux colonnes en r, créez quelques couches dans ggplot2 et la sortie de l'image en un <.png>.

i ont perdu d'innombrables heures bougeotte autour de la syntaxe; J'ai réussi à sortir les fichiers dont je avais besoin à un moment donné, mais (bêtement) n'ont pas remarqué et a continué gigoter avec mon code ...

Je sincèrement reconnaissant de toute l'aide; ci-dessous est un exemple (trivial) pour la démonstration. Merci beaucoup pour votre aide!!! ~ Eric Beurre


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 sortie est juste une image vide (181 b).


voici les erreurs communes couple R se jette comme je bidouiller dans 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: Erreur: Pas dans les couches parcelle

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: Erreur: Lorsque réglage l'esthétique, ils ne peuvent avoir une valeur. Problèmes: remplissage, x

Était-ce utile?

La solution

J'utilise rpy2 uniquement par le module peu brillante de Nathaniel Smith appelé rnumpy (voir " API » lien à la page d'accueil rnumpy). Avec cela, vous pouvez faire:

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)

(je devine un peu sur la façon dont vous voulez l'intrigue regarder, mais vous voyez l'idée.)

Une autre grande commodité entre dans "mode R" de Python avec le module ipy_rnumpy. (Voir le lien "intégration IPython" à la page d'accueil rnumpy).

Pour des choses compliquées, je prototype habituellement en R jusqu'à ce que j'ai les commandes complotant élaboré. rapports d'erreur dans rpy2 ou rnumpy peut être assez en désordre.

Par exemple, le résultat d'une cession (ou autre calcul) est parfois imprimé même quand il devrait être invisible. Ceci est gênant par exemple lors de l'attribution aux grandes trames de données. Une solution rapide est de mettre fin à la ligne offenser une déclaration de fuite qui permet d'évaluer à court quelque chose. Par exemple:

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

(Pour faire taire quelques avertissements récurrents dans rnumpy, j'ai édité rnumpy.py ajouter « des avertissements d'importation en garde » et remplacer « « erreur dans process_revents: ignoré » print » avec « avertir ( « erreur dans process_revents: ignoré » ). De cette façon, je ne vois que l'avertissement une fois par session.)

Autres conseils

Vous devez engager le dev () avant de le fermer, ce qui signifie que vous devez imprimer () (comme JD ci-dessus devine) avant de lancer 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']()

Pour le rendre un peu plus facile quand vous devez dessiner des parcelles plus complexes:

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top