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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    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 : 722
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 : 37
    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
    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 : 684
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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    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 : 37
    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
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 20
    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 : 37
    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
    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
    Membre expérimenté
    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
    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