treillis problématisation Options de tracé à l'aide rpy2
Question
Je suis en train de créer un terrain d'intensité de couleur heatmap ou à l'aide des données d'un tableau numpy, en utilisant rpy2 et treillis. J'utilise python 2.6.2, R 2.10.1, rpy2 2.1.9, pas sûr version du réseau. Je l'ai obtenu il fonctionne parfaitement, sauf que je dois modifier le réglage du réseau par défaut pour la rampe de couleur utilisée pour tracer les niveaux de la variable correspondante (z). Plus précisément, je veux en niveaux de gris au lieu de la rampe par défaut magenta-cyan. Voici le code pour générer une trame de données factice et créer la levelplot en niveaux de gris dans la vanille R:
library(lattice)
x <- rep(seq(1,10), each=10)
y <- rep(seq(1,10), 10)
z <- abs(rnorm(100))
z <- z/max(z)
df <- data.frame(x=x, y=y, z=z)
grayvector <- gray(seq(0,1,1/100))
foo <- levelplot(z ~ x * y, data=df, col.regions = grayvector)
print foo
Avec rpy2, je ne peux pas régler l'argument col.regions. Selon la documentation, rpy2 est censé convertir tout. caractères dans les arguments de fonction à _. Cela ne semble pas fonctionner, cependant, puisque l'utilisation des résultats de col_regions dans l'argument étant ignoré. Voici le code python qui produit le levelplot, mais sans en niveaux de gris:
from __future__ import division
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
r = ro.r
lattice = importr("lattice")
grayvector = r.gray( r.seq(0, 1, 1/100))
x = r.rep(r.seq(1,10), each=10)
y = r.rep(r.seq(1,10), 10)
z = r.abs(r.rnorm(100))
df = {'x': x, 'y' :y, 'z':z}
df = ro.DataFrame(foo)
formula = ro.Formula('z ~ x * y')
formula.getenvironment()['z'] = df.rx2('z')
formula.getenvironment()['y'] = df.rx2('y')
formula.getenvironment()['z'] = df.rx2('z')
foo = lattice.levelplot(formula, data=df, col_regions = grayvector)
print foo
Quelqu'un sait comment utiliser des arguments de fonction treillis avec. en eux rpy2?
La solution
Vous devez spécifier le mappage des arguments manuellement:
from rpy2.robjects.functions import SignatureTranslatedFunction
lattice = importr("lattice")
lattice.levelplot = SignatureTranslatedFunction(lattice.levelplot,
init_prm_translate={'col_regions': 'col.regions'})
foo = lattice.levelplot(formula, data=df, col_regions=grayvector)
Et aussi vérifier ceci: http://rpy.sourceforge.net /rpy2/doc-2.2/html/robjects_functions.html
Il est important de comprendre que la traduction est faite par l'inspection de la signature de la fonction de R, et que on ne peut guère deviner de la R ellipsis « ... » à chaque fois présent.