panel.superpose

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

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

panel.superpose

Messagepar Matthieu Lesnoff » 30 Jan 2006, 11:52

Bonjour

Je souhaite representer +sieurs courbes sur le meme graphique en utilisant xyplot(). J'y arrive en utilisant l'argument groups sous xyplot(), ou la fonction panel.xyplot() mais pas avec panel.superpose() et je ne comprend pas pourquoi. Quelqu'un a-t-il des exemples de graphiques utilisant panel.superpose() ?

Merci

Matthieu

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

Messagepar Renaud Lancelot » 30 Jan 2006, 18:50

Salut Matthieu,

Si j'ai bien compris ce que tu veux:

Code : Tout sélectionner

test <- data.frame(y = rnorm(100),
                   x = rep(1:25, 4),
                   g = rep(letters[1:4], each = 25))

library(lattice)
xyplot(y ~ x, groups = g, panel = "panel.superpose", type = "l", data = test)


Amicalement,

Renaud

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

Messagepar Matthieu Lesnoff » 31 Jan 2006, 06:06

[quote="Renaud Lancelot"]

Code : Tout sélectionner

test <- data.frame(y = rnorm(100),
                   x = rep(1:25, 4),
                   g = rep(letters[1:4], each = 25))

library(lattice)
xyplot(y ~ x, groups = g, panel = "panel.superpose", type = "l", data = test)


Merci Renaud. Le graphique resultat est celui que je recherche mais avec un autre type de syntaxe : en utilisant panel.xyplot ou panel.superpose en plus de fonctions comme panel.abline, au sein d'une fonction panel. Et ce que j'ai essaye ne marche pas bien.

Dans l'exemple ci-dessous, les differentes courbes sont jointes entre elles et je ne comprend pas pourquoi :

Code : Tout sélectionner

test <- data.frame(y = rnorm(100),
                   x = rep(1:25, 4),
                   g = rep(letters[1:4], each = 25))
xyplot(
    y ~ x,
    groups = g,
    data = test,
    panel = function(x,y){
        panel.xyplot(x, y, type = "l")
        panel.abline(v = 15, type = "l", col = "red")
        }
    )


Et je n'ai pas reussi a remplacer panel.xyplot ci-dessus par panel.superpose (qui a une syntaxe differente), ca plante.

Matthieu

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

Messagepar Renaud Lancelot » 31 Jan 2006, 07:49

C'est parceque tu ne donnes pas l'info sur les groupes à la fonction panel.superpose. C'est un cas où il est nécessaire de recourir aux "trois points", afin de passer cette info préalablement définie dans l'argument "groups":

Code : Tout sélectionner

xyplot(y ~ x,  groups = g, data = test,
    panel = function(x, y, ...){
        panel.superpose(x, y, type = "l", ...)
        panel.abline(v = 15, type = "l", col = "red")
        }
    )

Bien noter la nécessité des 3 points dans la définition de la fonction panel ET dans l'appel de la fonction panel.superpose.

En complément, et peut-être pour devancer une autre question, il est souvent nécessaire de définir une légende pour ce genre de graphe. Une solution simple est d'utiliser l'argument auto.key

Code : Tout sélectionner

xyplot(y ~ x,  groups = g, data = test,
    auto.key = list(lines = TRUE, points = FALSE),
    panel = function(x, y, ...){
        panel.superpose(x, y, type = "l", ...)
        panel.abline(v = 15, type = "l", col = "red")
        }
    )

Si tu veux plus de contrôle sur la légende, utiliser l'argument key.

Amicalement,

Renaud

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

Messagepar Matthieu Lesnoff » 31 Jan 2006, 10:34

Ok merci Renaud, ca marche avec panel.superpose.

Il reste un point que je ne comprend pas. Si on utilise panel.xyplot a la place de panel.superpose (mon exemple de code ds msg precedent), les differentes courbes (definies par g) sont liees entre elles ds le graphique resultat, donc ce n'est pas bon. Sais-tu si cela est normal et si c'est pour cela qu'on doit passer par panel.superpose et non par panel.xyplot ?

Matthieu

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

Messagepar Renaud Lancelot » 31 Jan 2006, 10:47

Ouaips: la fct panel.xyplot ne reconnaît pas les groupes. En revanche, regarde le code de panel.superpose:

Code : Tout sélectionner

...
        vals <- if (is.factor(groups))
            levels(groups)
        else sort(unique(groups))
...
        for (i in seq(along = vals)) {
            id <- (groups[subscripts] == vals[i])
            if (any(id)) {
                args <- list(x = x[id], subscripts = subscripts[id],
                  pch = pch[i], cex = cex[i], font = font[i],
                  fontface = fontface[i], fontfamily = fontfamily[i],
                  col.line = col.line[i], col.symbol = col.symbol[i],
                  lty = lty[i], lwd = lwd[i], alpha = alpha[i],
                  ...)
                if (have.type)
                  args$type <- type
                if (!is.null(y))
                  args$y <- y[id]
                do.call("panel.groups", args)
            }
        }

Tout dépend de la valeur prise par l'argument groups: les éléments du graphique sont définis dans la boucle for(){} qui est exécutée pour chaque élément du vecteur vals.

A+

Renaud

Matthieu Lesnoff
Messages : 120
Enregistré le : 29 Nov 2004, 12:41

Messagepar Matthieu Lesnoff » 01 Fév 2006, 05:19

Merci Renaud !

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

Messagepar Pierre Casadebaig » 21 Mar 2007, 14:51

Bonjour,

Je réponds à ce fil en déviant un peu du problème initial...

Je voudrais utiliser la fonction xyplot (le code de Renaud, surtout) pour tracer dans un seul graphe
* (valeur estimées = f(valeurs prédites)) par groupes (dans mon cas des variétés)
* la première bissectrice
* une légende indiquant la qualité d'ajustements (r² et RMSE) calculée precedement

Code : Tout sélectionner

xyplot(y ~ x,  groups = g, data = test,
    auto.key = list(space="right"),
    panel = function(x, y, ...){
        panel.superpose(x, y, type = "p", ...)
        panel.abline(0,1, type = "l", col = "red")
        }
    )


Mais je ne comprends pas du tout (l'aide de R pour l'argument "legend" de xyplot() est ardue pour un non initié...) comment ajouter un élément de légende dans cette fonction qui me parait plus pratique mais plus dure d'accès que les fonctions plot() et legend() comme

Code : Tout sélectionner

legend("bottomright", c(paste("r² =", r2), paste("RMSE =", rmse)), bty="n", cex=0.8)


L'avantage que je voyais principalement pour xyplot() est surtout a travers auto.key qui gère simplement les couleurs peu importe le nombre de groupes.

Merci pour votre aide !

Pierre

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 22 Mar 2007, 05:58

bonjour,

je me permet de vous indiquer la fonction matplot() du package graphics que je trouve beaucoup plus souple que les fonctions de lattice (en particulier je n'ai jamais trouvé comment se débarrasser du fond gris des graphiques de lattice).
La seule chose à faire est de présenter ses données un peu différemment c'est à dire sous forme de 2 matrices. Ensuite le paramétrage est sans limite puisqu'il utilise tous les paramètres de base (cf. par() )

Voilà, si ça peut servir à quelqu'un wui comme moi est un peu allergique au package lattice ;)

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

Messagepar Renaud Lancelot » 22 Mar 2007, 08:51

je me permet de vous indiquer la fonction matplot() du package graphics que je trouve beaucoup plus souple que les fonctions de lattice (en particulier je n'ai jamais trouvé comment se débarrasser du fond gris des graphiques de lattice).


J'utilise les deux types de fct: celles du package lattice sont infiniment plus souples que matplot et concernent un panel bcp plus large de types de graphes.

Par ailleurs, il faudrait mettre à jour votre version de R car le fond gris n'est plus la valeur par défaut des graphes Trellis depuis plus d'un an. Just for the record, la couleur du fond de ces graphes peut être contrôlée de différentes manières, par exemple en spécifiant un "theme" en passant par l'interface trellis.options. Par exemple, si vous voulez vous débarrasser du fond gris, vous pouvez faire:

Code : Tout sélectionner

lattice.options(default.theme = "col.whitebg")


Actuellement, il n'y a aucun theme par défaut et cela aboutit à des graphes sur fond blanc.

Renaud

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 22 Mar 2007, 09:25

J'utilise les deux types de fct: celles du package lattice sont infiniment plus souples que matplot et concernent un panel bcp plus large de types de graphes.


question de point de vue....et je ne faisais qu'indiquer une alternative à lattice dans ce cas précis.

Par ailleurs, il faudrait mettre à jour votre version de R car le fond gris n'est plus la valeur par défaut des graphes Trellis depuis plus d'un an. Just for the record, la couleur du fond de ces graphes peut être contrôlée de différentes manières, par exemple en spécifiant un "theme" en passant par l'interface trellis.options. Par exemple, si vous voulez vous débarrasser du fond gris, vous pouvez faire:


merci c déjà fait pour la version de R mais je n'avais pas testé depuis la librairie lattice et je suis bien content qu'ils aient enfin supprimer cette configuration inutile.

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

Messagepar Renaud Lancelot » 22 Mar 2007, 17:52

Inutile ? En fait, le fond gris vient d'expérimentations sur la perception visuelle qui montrent que l'oeil humain perçoit mieux les figures claires sur fond sombre que l'inverse. Mais il y a des exceptions (exemple: difficile à distinguer quand utilisation sur un projecteur vidéo dans une salle sombre). De plus, pas acceptable pour publis.

NB: l'auteur du package lattice a changé les valeurs par défaut suite à des demandes des utilisateurs. On devrait essayer la même chose avec Excel qui a toujours cette valeur par défaut sur ses graphes... ;-)

Renaud

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

Messagepar Renaud Lancelot » 24 Mar 2007, 14:58

Pierre Casadebaig a écrit :Bonjour,

Je réponds à ce fil en déviant un peu du problème initial...

Je voudrais utiliser la fonction xyplot (le code de Renaud, surtout) pour tracer dans un seul graphe
* (valeur estimées = f(valeurs prédites)) par groupes (dans mon cas des variétés)
* la première bissectrice
* une légende indiquant la qualité d'ajustements (r² et RMSE) calculée precedement


Vous n'êtes pas obligé d'utiliser une légende: vous pouvez simplement annoter le graphe:

Code : Tout sélectionner

x <- 1:10
y <- 2 * x + rnorm(10, 0, 2)
fm <- lm(y ~ x)
R2 <- round(summary(fm)$r.squared, 2)
S2 <- round((summary(fm)$sigma)^2, 2)


library(lattice)
library(grid)

xyplot(y ~ x,
  panel = function(x, y){
# points
    panel.xyplot(x, y)
# droite de régression
    panel.lmline(x, y)
# R2
    grid.text(x = unit(0, "npc") + unit(2, "mm"),
              y = unit(1, "npc") - unit(2, "mm"),
              hjust = 0, vjust = 1,
              label = bquote(R^2 == .(R2)))
# S2
    grid.text(x = unit(0, "npc") + unit(2, "mm"),
              y = unit(1, "npc") - unit(2, "mm") - unit(1, "lines"),
              hjust = 0, vjust = 1,
              label = bquote(hat(sigma)^2 == .(S2)))
    })


Code : Tout sélectionner

xyplot(y ~ x,  groups = g, data = test,
    auto.key = list(space="right"),
    panel = function(x, y, ...){
        panel.superpose(x, y, type = "p", ...)
        panel.abline(0,1, type = "l", col = "red")
        }
    )


Mais je ne comprends pas du tout (l'aide de R pour l'argument "legend" de xyplot() est ardue pour un non initié...) comment ajouter un élément de légende dans cette fonction qui me parait plus pratique mais plus dure d'accès que les fonctions plot() et legend() comme

Code : Tout sélectionner

legend("bottomright", c(paste("r² =", r2), paste("RMSE =", rmse)), bty="n", cex=0.8)



Pas vraiment. L'argument key est une liste nommée dont bcp d'éléments sont eux-mêmes des listes. Par exemple, les noms "space", "x", "y", "corner" indiquent la position de la légende (ne s'utilisent pas tous en même temps). Les élements de la légende elle-même sont des listes appelées text, points, lines, ou rectangles pour tracer du texte, des points, des lignes ou des rectangles, respectivement. Ils peuvent être répétés. A l'intérieur de chaque liste, on spécifie les attributs des éléments (libellé du texte, couleur, expansion, type de symbole, épaisseur des lignes,...):

Code : Tout sélectionner

maLegende <- list(
  x = .15, y = .9, corner = c(0, 1), columns = 1,
  text = list(text = c(parse(text = paste("R^2 ==", R2)),
                       parse(text = paste("hat(sigma)^2 ==", S2)))))

xyplot(y ~ x,
  key = maLegende,
  panel = function(x, y){
# points
    panel.xyplot(x, y)
# droite de régression
    panel.lmline(x, y)
    })


NB: l'exemple est compliqué par l'utilisation de symboles mathématiques (d'où l'utilisation d'expressions générées par parse).

Renaud

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

Messagepar Pierre Casadebaig » 26 Mar 2007, 11:47

Vraiment, merci beaucoup pour le temps que vous prenez pour répondre de manière aussi détaillée.
Des retours comme cela donnent envie de se plonger dans les fonctions utilisées ici pour essayer d'y voir plus clair sur ces manières différentes d'arriver à un même résultat, au lieu de s'arrêter au résultat.

Merci encore !


Retourner vers « Questions en cours »

Qui est en ligne

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

cron