Possibilités de la fonction xyplot()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Pierre Casadebaig
Messages : 67
Enregistré le : 07 Déc 2006, 12:31

Possibilités de la fonction xyplot()

Messagepar Pierre Casadebaig » 22 Mar 2007, 13:27

Bonjour,

Finalement, j'ai des interrogations plus larges à propos de cette fonction. Sans chercher de solution précise à un problème, j'ai du mal à savoir ce qui est possible ou non avec cette fonction. J'ai retenu simplement que l'utilisation première de xyplot() est de découper (doù le lattice/treillis ?) puis de représenter une variable en fonction de facteurs sans utiliser de boucles pour parcourir son jeu de données comme on pouvait faire avec plot().

Pour être plus concret, j'aurais besoin de tracer un graphe à deux dimensions, mais en ayant le moyen de conditionner par deux (ou 3) facteurs. Un conditionnerait la couleur de séries y=f(x) superposées, l'autre génèrerait selon son niveau des graphes cote à cote des ces différentes séries empilées. Le problème apparait quand la variable y n'est pas "homogène" selon le niveau d'un facteur : les différences d'échelles sont écrasées pour trouver une échelle qui convienne pour tout les graphes.

Un exemple proche est donnée par ce code où la variabilité de y est invisible entre les niveaux du facteur g:

Code : Tout sélectionner

library(lattice)
test <- data.frame(y = c(rnorm(50, mean=0), rnorm(50, mean=1000)),
                   x = rep(1:25, 4),
                   v = rep(rep(letters[1:2], each = 25), 2),
                   g = rep(c("I","II"), each = 50))
xyplot(y ~ x | g, groups = v, type = "p", data = test, auto.key=T)


Merci pour votre éclairage ... et pour les réponses dans l'autre fil ! (je creuse matplot() - mais changer la disposition des données est un peu contraignant quand le résultat d'une requete SQL donne la mise en forme correcte pour xyplot())

Pierre Casadebaig
Messages : 67
Enregistré le : 07 Déc 2006, 12:31

Messagepar Pierre Casadebaig » 22 Mar 2007, 17:34

Je viens de trouver le paramètre scale="free" qui résout en partie le problème décrit au dessus : il me reste plus qu'a trouver comme fixer des echelles identique pour x et y pour chaque modalité du facteur...

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 22 Mar 2007, 17:36

Voir l'argument scales de xyplot:

Code : Tout sélectionner

xyplot(y ~ x | g, groups = v, type = "p", data = test, auto.key=T,
       scales = list(relation = "free"))


NB: si vous aviez plusieurs variables conditionnant la relation y ~ x, la syntaxe de la formule serait du type

Code : Tout sélectionner

y ~ x | f * g * h

Vous auriez intérêt à lire le livre de Cleveland:

Cleveland, W. S. Visualizing data Hobart Press, 1993

ainsi que les documents, exemples et jeux de données disponibles à

http://stat.bell-labs.com/project/trellis/

Un excellent investissement pour les aspects techniques de la construction de graphes sous R (trellis et classiques) est le bouquin de Murrell:

Murrell, P. R graphics Chapman & Hall / CRC, 2005

Renaud

Pierre Casadebaig
Messages : 67
Enregistré le : 07 Déc 2006, 12:31

Messagepar Pierre Casadebaig » 22 Mar 2007, 17:52

Ok, merci pour l'indication de bibliographie !

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 24 Mar 2007, 12:02

Finalement, j'ai des interrogations plus larges à propos de cette fonction. Sans chercher de solution précise à un problème, j'ai du mal à savoir ce qui est possible ou non avec cette fonction. J'ai retenu simplement que l'utilisation première de xyplot() est de découper (doù le lattice/treillis ?) puis de représenter une variable en fonction de facteurs sans utiliser de boucles pour parcourir son jeu de données comme on pouvait faire avec plot().


Oui, c'est une des fonctionnalités importante. Mais il y en a bcp d'autres qui sont indiquées dans les références que j'ai données auparavant. Les graphes trellis sont la mise en oeuvre d'un ensemble de résultats sur la perception visuelle synthétisé par William Cleveland (un statisticien des laboratoire Bells) et programmés dans la bibliothèque de fonctions trellis développée pour S+. Par la suite, l'interface a été complètement reprogrammée par Deepayan Sarkar (package lattice) en s'appuyant sur le package grid (Paul Murrell) qui offre un ensemble de fonctions graphiques de bas niveau fondées sur des concepts différents de ceux sous-tendant les graphiques "traditionnels" de S+ et R.

Renaud

Elodie Sanchez
Messages : 13
Enregistré le : 29 Mar 2007, 15:41

Messagepar Elodie Sanchez » 02 Avr 2007, 07:09

Bonjour,
j'ai déjà lu quelques posts sur le sujet, mais je n'arrive pas à résoudre mon petit problème pour autant...
Je voudrais faire un graphique où figureraient plusieurs droites. Chacune de ces droites correspondraient à une série de valeurs. Et les valeurs de ces séries (en ordonnées) se réfèrent toutes une à une à une valeur précise. Ces valeurs précises sont contenues dans une autres série. Difficile à expliquer, donc voici un exemple condensé de mon tableau :

13 -0.076923077 -0.076923077 0 0
11 0 -0.090909091 0 -0.090909091
57 0.140350877 0.140350877 0.052631579 0.228070175
283 0.060070671 -0.222614841 -0.25795053 0.060070671
152 0.151315789 -0.375 -0.144736842 0.184210526
16 0 -0.0625 0 0.0625

la 1ère colonne correspond à la série de valeurs précises (pour l'axe des abscisses, où les valeurs doivent apparaitre par ordre croissant). Les 4 autres colonnes contiennent les points des 4 séries à partir desquels je souhaiterais tracer les droites.
En vous remerciant par avance pour votre aide.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 02 Avr 2007, 08:00

Bonjour,

Personnellement je n'utilise pas lattice, alors je vais te proposer une autre solution mais je suis sur que Renaud pourra te donner une solution avec lattice.

Code : Tout sélectionner

test
   F1         F2         F3          F4          F5
1  11 0.00000000 -0.0909091  0.00000000 -0.09090909
2  57 0.14035088  0.1403509  0.05263158  0.22807018
3 283 0.06007067 -0.2226148 -0.25795053  0.06007067
4 152 0.15131579 -0.3750000 -0.14473684  0.18421053
5  16 0.00000000 -0.0625000  0.00000000  0.06250000
# première chose remttre les données en ordre selon la première colonne
test <- test[order(test[,1]),]
test
   F1         F2         F3          F4          F5
1  11 0.00000000 -0.0909091  0.00000000 -0.09090909
5  16 0.00000000 -0.0625000  0.00000000  0.06250000
2  57 0.14035088  0.1403509  0.05263158  0.22807018
4 152 0.15131579 -0.3750000 -0.14473684  0.18421053
3 283 0.06007067 -0.2226148 -0.25795053  0.06007067

# je te propose d'utiliser matplot :
matplot(test[,1], test[,-1]) # je te laisse régler les paramètres graphiques

Tu obtiendras un truc du genre :
Image

Maxime

P.S : on flood un peu non ?

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 02 Avr 2007, 10:49

Avec lattice, donc:

Code : Tout sélectionner

> library(lattice)
> Tab
   V1          V2          V3          V4          V5
1  13 -0.07692308 -0.07692308  0.00000000  0.00000000
2  11  0.00000000 -0.09090909  0.00000000 -0.09090909
3  57  0.14035088  0.14035088  0.05263158  0.22807018
4 283  0.06007067 -0.22261484 -0.25795053  0.06007067
5 152  0.15131579 -0.37500000 -0.14473684  0.18421053
6  16  0.00000000 -0.06250000  0.00000000  0.06250000
>
> xyplot(V2 + V3 + V4 + V5 ~ V1, data = Tab[order(Tab$V1), ], type = "l", auto.key = TRUE)

Renaud

Elodie Sanchez
Messages : 13
Enregistré le : 29 Mar 2007, 15:41

Messagepar Elodie Sanchez » 02 Avr 2007, 12:12

Merci! J'ai retenue la 2eme solution, avec xyplot.
Maintenant la position de la légende me dérange... je ne m'en sors pas avec l'agurment key, peut-être y-a-t'il un moyen de la place sur la droite du graphe, et non au dessus ??
Aussi, j'ai tracer les courbes de tendance (que je voudrais de la forme y=ax+b) pour chaque série. J'ai procédé comme suit :
type=c("p","smooth), span=3. J'ai mis 3 pour le degré de lissage sans savoir à quoi cela correspondait vraiment... Une courbe de "lissage" correspond bien à une courbe de tendance??
Encore merci

Pierre Casadebaig
Messages : 67
Enregistré le : 07 Déc 2006, 12:31

Messagepar Pierre Casadebaig » 02 Avr 2007, 14:10

Pour gerer la position de la légende, vous pouvez utiliser l'argument "space", pour la placer "globalement" ou bien préciser les coordonnées d'un point de la boite encadrant la légende :

Code : Tout sélectionner

auto.key = list(x=0.74, y=0.9, corner=c(0, 1), columns=3, between=1, between.columns=1)

ou bien

Code : Tout sélectionner

auto.key=list(space="right")


Du coup, j'en profite aussi pour parler de mon problème esthétique du moment : savez vous comment changer la couleur des symboles de la légende ? Le problème venant du fait que les couleurs par défaut "bouclent" au bout de 7...

l'argument "col" change la couleur du texte de la légende, mais la valeur de points$col reste à la valeur par défaut. Faut-il forcement passer par la fonction simpleKey() (qui ne donne pas non plus de bon résultat avec un "col" personnalisé) ou bien construire l'objet de la légende à la main ?

Merci !

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 02 Avr 2007, 14:29

Bonjour,

cf post récent sur cette question. Utiliser l'argument key qui attend une liste qui peut être construite en dehors de xyplot pour plus de clarté.

Renaud

Elodie Sanchez
Messages : 13
Enregistré le : 29 Mar 2007, 15:41

Messagepar Elodie Sanchez » 02 Avr 2007, 14:35

Je dis ça un peu au hasard, mais ça ne marche pas en changeant la couleur des points dans le graphe lui-meme?


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité