legendes multiples

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

Elise Lacoste
Messages : 33
Enregistré le : 02 Juin 2009, 15:49

legendes multiples

Messagepar Elise Lacoste » 14 Déc 2016, 17:11

Bonjour,

J'ai un problème avec la création de légendes dans les graphiques de base.
J'utilise depuis longtemps ggplot et je m'aperçois que je ne suis pas capable de faire un graphique classique..bref:
Je plotte les résultats d'une mds avec 2 facteurs: transect (8 niveaux) et distance (6 niveaux):

Code : Tout sélectionner

plot(mds.tot$points,col=endo$transect_id,pch=endo$dist_int)
     ordiellipse(mds.tot, endo$transect_id, display = "sites", kind = "sd", label = T,col=c(1:8))
     legend("bottomleft",legend=levels(endo$transect_id),col=levels(endo$transect_id))
    legend("bottomright",legend=levels(endo$dist_int),pch=levels(endo$dist_int))
   


1er problème: j'ai été obligée de transformer mes distances en integer sinon le plot ne prends pas mes niveaux (factor à l'origine), du coup au lieu d'avoir -25,-10 etc, j'ai 1, 2 etc,le graphique n'accepte pas les facteurs?
2me problème: je voudrai 2 légendes distinctes pour les transects et la distance (si je combine les 2 il y a trop de possibilités)..mais il y a un micmac entre les signes et les couleurs.

Si quelqu'un peut m'éclairer..
Merci!

Élise

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: legendes multiples

Messagepar Mickael Canouil » 15 Déc 2016, 09:37

Bonjour,

serait-il possible d'avoir un extrait du jeu de données? (viewtopic.php?f=1&t=3302)

Si vous êtes familière avec ggplot2, pourquoi ne pas faire le graphique avec?
Mickaël
mickael.canouil.fr | rlille.fr

Elise Lacoste
Messages : 33
Enregistré le : 02 Juin 2009, 15:49

Re: legendes multiples

Messagepar Elise Lacoste » 16 Déc 2016, 16:53

Voici un extrait (j'espère que j'ai fais ça correctement..).
La mds est faite avec la fonction metaMDS sur les espèces.

Avec ggplot2 c'est un peu fastidieux car il faut reconstruire des tableaux pour les groupes qu'on veut utiliser pour les ellipses.
Bref maintenant c'est fait mais j'avoue que je suis un peu frustrée d'être bloquée avec l'autre possibilité, et ça pourra toujours me servir je pense ;-)

Code : Tout sélectionner

endo <- structure(list(saison = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Automne",
"Été"), class = "factor"), transect = structure(c(3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L), .Label = c("D-1", "D-2", "DD-1", "DD-2", "Tem1", "Tem2"), class = "factor"),
    transect_id = structure(c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("D-1",
    "D-2", "DD-1", "DD-2", "DD-3", "Tem1", "Tem2", "Tem3"), class = "factor"),
    replicat = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L,
    5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c("a",
    "b", "c", "d", "e"), class = "factor"), sta = structure(c(11L,
    11L, 11L, 11L, 11L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L,
    14L, 14L, 16L, 16L, 16L, 16L, 16L), .Label = c("D-1_1", "D-1_11",
    "D-1_4", "D-1_6", "D-1_8", "D-2_1", "D-2_11", "D-2_4", "D-2_6",
    "D-2_8", "DD-1_1", "DD-1_11", "DD-1_4", "DD-1_6", "DD-1_7",
    "DD-1_8", "DD-2_1", "DD-2_11", "DD-2_4", "DD-2_6", "DD-2_8",
    "Tem1_500", "Tem2_500"), class = "factor"), dist = structure(c(2L,
    2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 4L,
    4L, 4L, 4L, 4L), .Label = c("-10", "-25", "0", "10", "25",
    "500"), class = "factor"), dist_num = structure(c(3L, 3L,
    3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
    2L, 2L, 2L), .Label = c("0", "10", "25", "500"), class = "factor"),
    dens = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("double",
    "simple", "tem"), class = "factor"), Ampharete_lindstroemi = c(0,
    0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    Ampharetidae_spp = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0), Annelida = c(0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Asteroidea = c(0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    Bivalvia = c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 1, 1, 0, 0,
    4, 0, 1, 0, 1), Boonea_bisuturalis = c(0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Cancer_borealis = c(0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("saison",
"transect", "transect_id", "replicat", "sta", "dist", "dist_num",
"dens", "Ampharete_lindstroemi", "Ampharetidae_spp", "Annelida",
"Asteroidea", "Bivalvia", "Boonea_bisuturalis", "Cancer_borealis"
), row.names = c(NA, 20L), class = "data.frame")

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: legendes multiples

Messagepar Mickael Canouil » 19 Déc 2016, 12:28

Bonjour,

Les données de l'exemple correspondant à votre situation

Code : Tout sélectionner

library(ggplot2)
library(vegan)

data(dune)
mds.tot <- vegan::metaMDS(dune)
dune[, "transect_id"] <- cutree(hclust(dist(dune)), 4)
dune[, "dist_int"] <- factor(ifelse(dune[, "transect_id"]!=2, dune[, "transect_id"]*5, dune[, "transect_id"]*-5))
dune[, "transect_id"] <- factor(dune[, "transect_id"])


Pour résoudre votre problème, il faut "jouer" avec les conversions de types, en effet, "col" et "pch" ont besoin d'entiers, or vous souhaitez conserver la vraie valeur (chose faite nativement dans ggplot2), voici comment le faire (une façon de faire) avec votre le code que vous avez fournie sur le jeu de données ci-dessus:

Code : Tout sélectionner

plot(mds.tot$points, col = as.integer(dune$transect_id), pch = as.integer(dune$dist_int))
ordiellipse(mds.tot, as.integer(dune$transect_id), display = "sites", kind = "sd", label = TRUE, col = seq_len(8))
legend("bottomleft", legend = levels(dune$transect_id), col = as.integer(sort(unique(dune$transect_id))), pch = 1)
legend("bottomright", legend = levels(dune$dist_int), pch = as.integer(sort(unique(dune$dist_int))))



En bonus, la même chose en ggplot2 avec les ellipses

Code : Tout sélectionner

library(ellipse)
dfxy <- cbind.data.frame(mds.tot$points, transect_id = dune$transect_id, dist_int = dune$dist_int)
dataEllipse <- do.call("rbind", lapply(levels(dfxy[, "transect_id"]), function (g) {
    cbind(
        as.data.frame(with(
            dfxy[dfxy[, "transect_id"]==g, ],
            ellipse(
                cor(MDS1, MDS2),
                scale = c(sd(MDS1), sd(MDS2))/3,
                centre = c(mean(MDS1), mean(MDS2))
            )
        )),
        class = g
    )
}))

ggplot(data = dfxy) +
    geom_hline(aes(yintercept = 0)) + geom_vline(aes(xintercept = 0)) +
    geom_point(aes(x = MDS1, y = MDS2, colour = transect_id, shape = dist_int)) +
    geom_path(data = dataEllipse, aes(x = x, y = y, colour = class))

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Elise Lacoste
Messages : 33
Enregistré le : 02 Juin 2009, 15:49

Re: legendes multiples

Messagepar Elise Lacoste » 29 Déc 2016, 11:24

Excellent, ça fonctionne.
Merci!
Cdlt Élise


Retourner vers « Questions en cours »

Qui est en ligne

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