IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Fonction GGplot2 - légende box


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Points : 8
    Points
    8
    Par défaut Fonction GGplot2 - légende box
    Bonjour,

    Je cherche à faire un truc qui parait simple mais je ne trouve pas la commande pour cela...

    A partir de mes données, j'arrive à cela :
    Nom : 160216042257808500.jpg
Affichages : 684
Taille : 42,7 Ko

    Je souhaiterais pouvoir donner des couleurs plus marquées entres elles que celles que j'ai ici et ajouter pour chaque rectangle, le numéro correspondant (1à10). L'idéal serait également que la couleur de mon rectangle corresponde à la couleur attribuée dans la légende...
    Voici mon code :

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ggplot() +
      geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) +
      geom_text(data=label(dendr), aes(x, y, label=label, hjust=0, color=cluster),
                size=3) +
      geom_rect(data=rect, aes(xmin=X1-.3, xmax=X2+.3, ymin=0, ymax=ymax),
            color=rect$rect.cluster, fill=NA)+
      geom_hline(yintercept=0.33, color="red")+
      theme_dendro()


    Donc si vous avez des solutions pour cela et également pour améliorer l’esthétique, je suis preneur.

    Merci

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    En faisant une rapide recherche, je suis tombée sur le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    library(ggplot2)
    library(ggdendro)
    library(plyr)
    library(zoo)
     
    df <- USArrests                       # really bad idea to muck up internal datasets
    labs <- paste("sta_", 1:50, sep = "") # new labels
    rownames(df) <- labs                  # set new row names
     
    cut <- 4    # Number of clusters
    hc <- hclust(dist(df), "ave")              # heirarchal clustering
    dendr <- dendro_data(hc, type = "rectangle") 
    clust <- cutree(hc, k = cut)               # find 'cut' clusters
    clust.df <- data.frame(label = names(clust), cluster = clust)
     
    # Split dendrogram into upper grey section and lower coloured section
    height <- unique(dendr$segments$y)[order(unique(dendr$segments$y), decreasing = TRUE)]
    cut.height <- mean(c(height[cut], height[cut-1]))
    dendr$segments$line <- ifelse(dendr$segments$y == dendr$segments$yend &
       dendr$segments$y > cut.height, 1, 2)
    dendr$segments$line <- ifelse(dendr$segments$yend  > cut.height, 1, dendr$segments$line)
     
    # Number the clusters
    dendr$segments$cluster <- c(-1, diff(dendr$segments$line))
    change <- which(dendr$segments$cluster == 1)
    for (i in 1:cut) dendr$segments$cluster[change[i]] = i + 1
    dendr$segments$cluster <-  ifelse(dendr$segments$line == 1, 1, 
                 ifelse(dendr$segments$cluster == 0, NA, dendr$segments$cluster))
    dendr$segments$cluster <- na.locf(dendr$segments$cluster) 
     
    # Consistent numbering between segment$cluster and label$cluster
    clust.df$label <- factor(clust.df$label, levels = levels(dendr$labels$label))
    clust.df <- arrange(clust.df, label)
    clust.df$cluster <- factor((clust.df$cluster), levels = unique(clust.df$cluster), labels = (1:cut) + 1)
    dendr[["labels"]] <- merge(dendr[["labels"]], clust.df, by = "label")
     
    # Positions for cluster labels
    n.rle <- rle(dendr$segments$cluster)
    N <- cumsum(n.rle$lengths)
    N <- N[seq(1, length(N), 2)] + 1
    N.df <- dendr$segments[N, ]
    N.df$cluster <- N.df$cluster - 1
     
    # Plot the dendrogram
    ggplot() + 
       geom_segment(data = segment(dendr), 
          aes(x=x, y=y, xend=xend, yend=yend, size=factor(line), colour=factor(cluster)), 
          lineend = "square", show_guide = FALSE) + 
       scale_colour_manual(values = c("grey60", rainbow(cut))) +
       scale_size_manual(values = c(.1, 1)) +
       geom_text(data = N.df, aes(x = x, y = y, label = factor(cluster),  colour = factor(cluster + 1)), 
          hjust = 1.5, show_guide = FALSE) +
       geom_text(data = label(dendr), aes(x, y, label = label, colour = factor(cluster)), 
           hjust = -0.2, size = 3, show_guide = FALSE) +
       scale_y_reverse(expand = c(0.2, 0)) + 
       labs(x = NULL, y = NULL) +
       coord_flip() +
        theme(axis.line.y = element_blank(),
            axis.ticks.y = element_blank(),
            axis.text.y = element_blank(),
            axis.title.y = element_blank(),
            panel.background = element_rect(fill = "white"),
            panel.grid = element_blank())
    Qui permet d'obtenir le rendu suivant :

    Nom : dendro.png
Affichages : 645
Taille : 5,9 Ko


    Cela ne répond pas complètement à votre problématique mais le rendu est intéressant il me semble, alors cela peut peut-être vous donner des pistes.
    HTH !


    Cordialement,


    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    merci de la réponse, je vais voir si ça peut m'aider un peu ^^
    Disons qu'un des principaux soucis est la mise en forme des couleurs (légende ne correspondant pas aux box). je vais donc tester.

  4. #4
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Re-bonjour,

    Je vais peut-être dire une bétise mais il me semble qu'il n'y a pas de problème avec les couleurs sur votre graphique ? Je pense simplement que la numérotation (présente dans la légende) n'est pas faite dans l'ordre de gauche à droite (par exemple) mais plutôt en fonction de la longueur des branches menant à chaque groupe...
    Après vu que je n'ai pas accès à vos données, je ne suis pas sûre de ce que j'avance mais ça me parait plausible.


    Cordialement,


    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Re

    En effet, la séparation est bien faite selon la longueur et par exemple mes numéros 8-9-10 sont situés en plein milieu.
    Le problème des couleurs c'est qu'il m'est difficile de distinguer le vert foncé du vert moyennement foncé par exemple. Et les rectangles colorés ne correspondent pas à la couleur de la légende (carré de droite non rouge alors qu'il devrait l'être).
    Dans l'idéal, je souhaiterai avoir ce que vous m'avez indiqué mais avec les numéros de groupes qui ont été définis (selon la longueur de branche) et non pas dans l'ordre gauche-droite.

  6. #6
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Je ne suis pas très familière de la réalisation de dendrogrammes avec ggplot...
    Une suggestion cependant, dans votre code : avez-vous essayé de mettre le même paramètre pour spécifier la couleur dans "geom_text" et "geom_rect" ?
    En effet, pour le moment vous avez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    geom_text(... color=cluster) ...) +
    geom_rect(... color=rect$rect.cluster ...)
    Sinon, est-ce que vous pouvez éventuellement mettre à dispo votre jeu de données ou un extrait, sur lequel tester ?


    Cordialement,


    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Bonjour, voici le jeu de donnée et le script associé :

    Arrh267_Pres_abs.xlsx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    ##########################################################
    #####Importation tableau des Arrhenatheretea##############
    ##########################################################
    #####
    #Tableau transposé (1ligne=1relevé) avec x#
    Arrhtr<-read.csv("U:/Villejoubert-G/Service civique 2015-2016/R/Relevesarrhpur/5.Arrh267_10sp_transp.csv",header=T,sep=";",dec=",")
     
    #Tableau transposé (1ligne=1relevé) sans x#
    Arrhtr2<-read.csv("U:/Villejoubert-G/Service civique 2015-2016/R/Relevesarrhpur/5.Arrh267_10sp_transp2.csv",header=T,sep=";",dec=",")
     
    #Tableau transposé (1ligne=1relevé) tout pris en compte (r,i...)#
    ##row.names pour indiquer que la premierè colonne correspond à la légende des lignes
    Arrhtr3<-read.csv("U:/Villejoubert-G/Service civique 2015-2016/R/Relevesarrhpur/Arrh267_Pres_abs.csv",header=T,sep=";",dec=",",row.names=1)
    Arrhtr3_Num<-read.csv("U:/Villejoubert-G/Service civique 2015-2016/R/Relevesarrhpur/Arrh267_Pres_abs.csv",header=T,sep=";",dec=",")
     
    #Création d'un data frame à 1 colonne contenant les numéros de relevés#
    Num<-Arrhtr3_Num[,1]
     
    #Data frame contenant les relevés (coeff+sp) et le numéro des relevés
    Arrh<-cbind(Num,Arrhtr3)
     
    ##########################################################
    #####Traitement tableau des Arrhenatheretea###############
    ##########################################################
    library(ade4)
    library(vegan)
     
    ###
    #AFC#
    ###
    #####
    AFC_Arrhtr<-dudi.coa(Arrhtr3)
    2
    names(AFC_Arrhtr)
    AFC_Arrhtr$eig
    sum(AFC_Arrhtr$eig[1:2])/sum(AFC_Arrhtr$eig)
     
    #Affichage des valeurs propres#
    A<-(AFC_Arrhtr$eig/sum(AFC_Arrhtr$eig))*100
    barplot(A,ylab="% d'inertie",names.arg=round(A,1),cex.names =0.6,las=2)
    title("Eboulis des valeurs propres en %")
    ##las pour la disposition de la légende des axes. 
    ##0: Parallèles aux axes, 1: Horizontales, 2: Perpendiculaires aux axes, 3: Verticales
     
    #Valeurs propres en %#
    round(AFC_Arrhtr$eig/sum(AFC_Arrhtr$eig)*100,2)
     
    #Représentation AFC#
    s.label(AFC_Arrhtr$co, clabel=0.7)
    s.label(AFC_Arrhtr$li, clabel=0.7)
    scatter(AFC_Arrhtr)
     
    #Contributions relatives#
    inertia.dudi(AFC_Arrhtr,col.inertia = T)$col.abs  #pour colonnes#
    inertia.dudi(AFC_Arrhtr,row.inertia = T)$row.abs  #pour les lignes#
    #
     
    ###################
    ##CAH méthode de Ward##
    ###################
    #####
    #Calcul du tableau des distances pour les relevés#
    dc2<-dist(AFC_Arrhtr$li, method ="euclidean", diag=FALSE, upper=FALSE)
     
    ##AFC_Arrhtr$li= contient les variables de l'AFC#
    ##methode= calcul des distances, ici des distances euclidiennes#
    ##diag=indique si la diagonale des distances de la matrice doit être affichée#
    ##upper=triangle des distances doit être affiché#
     
    #Dendrogramme#
    hier2<-hclust(dc2,"ward.D")
    plot(hier2,hang=-1,main='cluster')
     
    #Nombres de classes#
    k=10
    rect.hclust(hier2,k, border='blue')
     
    ##hclust() permet de dessiner le dendrogramme#
    ##"ward.D"-> méthode que l'on va utiliser, autre par ex:UPGMA#
    ##rect.hclust () permet d'afficher des rectangles autour des classes sur le dendro#
    ##k=nb de classe#
    ##border=couleur de la bordure du rect#
     
    #Récupération des groupes (k classes)#
    cl2<-cutree(hier2,k)
    cl2
     
    #Importation des librairies nécessaires à la réalisation de la commande#
    library(ggplot2)
    library(ggdendro) #pour dendro_data
     
    #Conversion pour lecture avec ggplot
    dendr<- dendro_data(hier2, type="rectangle")
     
    #Data frame contenant numéro relevé + Numéro de groupe selon coupe dendro
    cl2.df <- data.frame(label=rownames(Arrh), cluster=factor(cl2))
     
    #Execution commande
    dendr[["labels"]]<- merge(dendr[["labels"]],cl2.df, by="label")
    rect <- aggregate(x~cluster,label(dendr),range)
    rect <- data.frame(rect$cluster,rect$x)
    ymax <- mean(hier2$height[length(hier2$height)-((k-2):(k-1))])
     
    #Création du dendrogramme avec les groupes identifiés selon une couleur#
    #label=laber pour avoir les numéros de relevés, =NA pour ne rien avoir
    ggplot() + 
      geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
      geom_text(data=label(dendr), aes(x, y, label=label, hjust=0, color=cluster), 
                size=3) +
      geom_rect(data=rect, aes(xmin=X1-.3, xmax=X2+.3, ymin=0, ymax=ymax), 
                color=rect$rect.cluster, fill=NA)+
      geom_hline(yintercept=0.33, color="red")+
      theme_dendro()
    ## pour retourner le dendro ajouter "+coord_flip() + scale_y_reverse(expand=c(0.2, 0)) +"
    Je ne peux pas mettre les deux mêmes car les rectangles s'appuie sur "data=rect2" et le texte sur "data=label(dendr)".

  8. #8
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par Geofv Voir le message
    [...] Je souhaiterais pouvoir donner des couleurs plus marquées entres elles que celles que j'ai ici et ajouter pour chaque rectangle, le numéro correspondant (1à10). L'idéal serait également que la couleur de mon rectangle corresponde à la couleur attribuée dans la légende [...]
    Vous le savez sans doute déjà, dans le terme « ggplot », gg signifie « grammar of graphics ». Cette grammaire est puissante et se veut élégante, encore faut-il l'appendre avant d'exploiter pleinement ses possibilités. Alors, pardonnez une auto-citation, mais dans ce post se trouve un résumé rapide de comment raisonner à la ggplot2 pour réaliser vos souhaits. En plus de ce post, quelques autres points à signaler.
    • Dans les extraits de code de vos posts, la couleur du graphique dépend d'une variable de type factor. La grammaire spécifie que pour ce type, seules les scales discrètes sont applicables ; conséquence : impossible de faire du remplissage des différents keys de la légende.
    • Cette impossibilité peut être levée en créant une variable numérique sur laquelle appliquer des scales continues.
    • Les numéros que vous voulez ajouter à la légende sont appelés keys labels et sont modifiables à l'aide des diverses fonctions de manipulation des guides.


    Une fois que les diverses notions de la grammaire sont maîtrisées, tout devient très intuitif : le gros du travail à faire est déporté sur les données, le rendu est laissé à la cuisine interne de ggplot2 et son système sous-jacent de graphiques (grid). La théorie de la grammaire est l'œuvre de Leland WILKINSON mais pour commencer on peut s'en passer et se référer plutôt au bouquin qui explique comment elle est implémentée en R, bouquin qui est libre. Ainsi, son sixième chapitre explique-t-il pleinement comment le cas présent peut-être résolu. Les guides sont résumés avec cette figure. Par ailleurs, la documentation venant avec ggplot2 est complétée avec un site web qui donne de nombreux exemples.

    En accéléré, un peu de code à partir des données que vous avez indiquées (préalablement exportées en CSV) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    library("ade4")
    library("ggplot2")
    library("ggdendro")
     
    arrh267Data <- read.csv2("arrh267_pres_abs.csv", quote = "", stringsAsFactors = FALSE)
     
    classCount <- 10L
     
    hier2 <- hclust(
        dist(dudi.coa(arrh267Data, scannf = FALSE, nf = classCount)$c1,
             method = "euclidean", diag = FALSE, upper = FALSE),
        "ward.D")
     
    dendr <- dendro_data(as.dendrogram(hier2))
    dendr$labels$labNum <- seq_along(dendr$labels$label)
     
    thePlot <- ggplot() +
        geom_segment(data = segment(dendr), aes_string("x", "y", xend = "xend", yend = "yend")) +
        geom_text(
            data = label(dendr), aes_string("x", "y", label = "label", hjust = .0, colour = "labNum"),
            size = 3.) +
        geom_hline(yintercept = hier2$height[40L], colour = "red") +
        scale_colour_gradientn(colours = colours()[seq(from = 40L, length.out = classCount)]) +
        labs(colour = "Custom legend title") +
        theme_dendro() +
        coord_flip()
     
    print(thePlot)

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2008, 11h08
  2. fonction message box dans crystal report ?
    Par CyberMen dans le forum Débuter
    Réponses: 2
    Dernier message: 27/06/2008, 16h47
  3. Desactiver les fonctions de routage d'une box
    Par shinji78 dans le forum Hardware
    Réponses: 3
    Dernier message: 20/06/2007, 15h51
  4. [MySQL] Filtrage par ma requête sql en fonction du résultat d'un combo box
    Par digger dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/02/2006, 17h25
  5. graphique qui varie en fonction d'une combo box
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 13/10/2005, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo