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 :

ggplot2 / Effectif sur boxplot / Boucle itérative création graphe


Sujet :

R

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Physicienne Médicale
    Inscrit en
    Mai 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Physicienne Médicale

    Informations forums :
    Inscription : Mai 2019
    Messages : 32
    Points : 25
    Points
    25
    Par défaut ggplot2 / Effectif sur boxplot / Boucle itérative création graphe
    Bonjour,

    J’ai besoin d’un coup de pouce car je cherche depuis quelques jours une solution à mon problème de visualisation dans un graphique boxplot sans succès ou pas avec ggplot… (je débute totalement avec R, merci).

    !!! Mes questions portent sur : Ajout d'un effectif sur un boxplot réalisé avec ggplot / réaliser une boucle itérative pour faire ce boxplot avec tous les valeurs d'une colonne

    J’ai importé un fichier excel pour créer une table de données nommées « RECUEIL », comprenant une cinquantaine de colonnes dont :
    -des actes de chirurgie (43 « Acte ») : pose_de_pacemaker, ostheosynthese,…
    - des centres hospitaliers (57 « Num_Etablissement ») : 1,2,3,….,57
    - un tag d’exclusion : « Inclus », « Exclu »
    - la dose RX (PDS)
    Je précise : les centres hospitaliers ne couvrent pas tous les mêmes actes.

    Mon but étant de créer un boxplot par acte (avec ggplot), avec les différents centres en abscisses. J’ai réussi avec le code suivant, exemple pour 1 acte donné (pose de pacemaker) :

    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
    #Exclusion des actes tagués “Exlu”
    RECUEIL <- subset(RECUEIL, Exclu.ou.Inclus == "Inclus")
    
    #Transformation des numéro des centres en caractères (avec ajout du mot « centre » + son numéro)
    RECUEIL$Num_etablissement <- paste("centre",RECUEIL$Num_etablissement,sep=" ")
    
    # création d’une table PM1 ou j’extrait uniquement l’acte « pose de pace maker »
    PM1<- RECUEIL[RECUEIL$Acte== "PACEMAKER_DAI_1_2_SONDES",]
    
    # création du boxplot pour l'acte PaceMaker»
    library(ggplot2)
    ggplot(PM1)  +
    aes(x=Num_etablissement,y=PDS) +
    geom_boxplot(alpha=0.7) + 
    ggtitle("Pose de PaceMaker 1 ou 2 sondes") +
    xlab("") +
    ylab("PDS (Gy.cm²)") +
    theme(plot.title = element_text(face="bold", colour = "blue", size = 15, hjust=0.5)) +
    theme(axis.title.y = element_text(face="bold", colour = "black", size = 12)) +
    theme(axis.title.x = element_text(face="italic", colour = "black", size = 12)) +
    theme(axis.text.x =element_text(angle=45, hjust=1, colour="blue", size = 8))
    ggsave(“PM1.jpg”)
    j'obtiens un beau graphique :
    Nom : PM.jpg
Affichages : 617
Taille : 50,2 Ko

    !!! Mes questions :

    1/ Comment ajouter l’effectif sur lequel a été réalisé chaque boxplot ? par exemple j’aimerai ajouter dans le nom du centre l’effectif (nombre de données utilisées pour chaque centre) : « centre 1 : N=effectif ». J'ai trouvé des débuts de solution en cherchant sur google mais je n'ai pas vraiment réussi à les adapter à ma situation.

    2/ Comment réaliser une boucle itérative pour faire automatiquement mes graphes pour chaque acte (au lieu de construire le même graphe en changeant juste le nom du ggplot et du ggsave. (ou si vous avez un bon tuto simple à me conseiller pour faire ça).
    J'ai colorié en rouge l'acte de la pose de PaceMaker dans mon script, sachant que tout cela correspond à un seul acte ("PACEMAKER_DAI_1_2_SONDES") on peut imaginer employer le même nom de l'acte (et ceci pour chaque acte) pour tous les secteurs en rouge, même si pour simplifier j'ai utilisé PM1.

    3/ Question subsidiaire : pourquoi est-ce que dans la table PM1 créée je retrouve tous les actes lorsque je ne devrais retrouver QUE l’acte "PACEMAKER_DAI_1_2_SONDES", non ?

    résultat attendu pour moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [1] "PACEMAKER_DAI_1_2_SONDES"
    résultat obtenu :

    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
     [1] "ARTERIO_MEMBRES_INF"                 "ARTERIO_MEMBRES_SUP"                
     [3] "ARTHRODESE_RACHIS_CIEL_OUVERT"       "CHOLECYSTECTOMIE"                   
     [5] "CPRE"                                "CYPHOPLASTIE_PERCUTANEE"            
     [7] "DILAT_ART_FEMORALE_avec_PROTHESE"    "DILAT_ART_FEMORALE_exclusive"       
     [9] "DILAT_ART_ILIAQUE_avec_PROTHESE"     "DILAT_ART_ILIAQUE_exclusive"        
    [11] "DILATAT_OESO_OU_COLIQUE"             "DRAINAGE_DES_VOIES_BILIAIRES"       
    [13] "EEP_EXCULSIVE"                       "ENDOPROTHESE_AORT_ABDOMINALE"       
    [15] "ENDOPROTHESE_AORT_THORACIQUE"        "ENDOPROTHESE_FENETREE"              
    [17] "HERNIE_DISCALE_CERVICALE"            "HERNIE_DISCALE_LOMBAIRE"            
    [19] "IMPLANTATION_STIMULATEUR"            "Laminectomie"                       
    [21] "LITHOTRITIE"                         "MBRE_INF_col_fémur_hanche"          
    [23] "MBRE_INF_genou_cheville_pieds_jambe" "MBRE_INF_hallux_valgus"             
    [25] "MBRE_SUP_coude"                      "MBRE_SUP_epaule_humerus_clavicule"  
    [27] "MBRE_SUP_main_poignet_avant_bras"    "NEPHROSTOMIE"                       
    [29] "OSTEOSYNTHESE_OUVERTE_RACHIS"        "OSTEOSYNTHESE_PERCUTANEE_RACHIS"    
    [31] "PACEMAKER_DAI_1_2_SONDES"            "PACEMAKER_DAI_3_SONDES"             
    [33] "PBH_TJ"                              "PONTAGE_VASCULAIRE"                 
    [35] "POSE_DVI_ou_PICCLINE"                "PROTHESE_OESOPHAGIENNE"             
    [37] "SONDE_JJ_ou_J"                       "THERMOCOAGULATION"                  
    [39] "TROUBLES_RYT_COMPLEXES"              "TROUBLES_RYT_CONVENTIONNELS"        
    [41] "UPR_exclusive"                       "URETEROSCOPIE"                      
    [43] "VERTEBROPLASTIE_PERCUTANEE"

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Pour répondre aux questions 1 et 3, ton vecteur ACTE est de type factor. C'est à dire que pour R, il est stocké comme des valeurs entières (1, 2, ..., 43) et qu'à côté de ça, un dictionnaire (les "niveaux") associe à chaque entier un libellé. Pour la question 3, ce qui se passe, c'est que tu filtres les données mais que le dictionnaire demeure inchangé. Une fonction comme table va d'abord regarder le dictionnaire pour préparer son tableau, et ensuite le remplir avec les comptages observés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    test <- as.factor(c("a","b","a","c","a","b","a","c","b","a","b"))
    table(test)
     
    test2 <- test[test != "a"]
    table(test2) # le niveau a est toujours là
     
    test2 <- test[test != "a", drop=TRUE] # on met à jour le dictionnaire
    table(test2) # a n'est plus là
    Pour ajouter les effectifs, on peut modifier le dictionnaire ; la fonction levels est accessible aussi bien en lecture qu'en écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    levels(test)
    paste0("N=",table(test))
    levels(test) <- paste(levels(test),
                          paste0("N=",table(test)),
                          sep="\n")
    Comme les intitulés de l'axe des X vont être longs, je te conseille de permuter les axes (avec la fonction coord_flip() dans ggplot2) pour avoir les libellés à l'horizontale, c'est plus lisible.

    Pour la question 2, écrire une boucle dans R n'est pas très compliqué (il ne faut juste pas s'en servir pour n'importe quoi, mais dans ton cas, elle est tout à fait légitime).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (cet_acte in unique(RECUEIL$Acte)){
       # ici vient tout le code pour filtrer les données, créer le graphique et le sauvegarder
    }
    L'objet cet_acte s'utilise comme un paramètre. Je te conseille, avant d'écrire la boucle, de t'exercer en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cet_acte <- "PACEMAKER_DAI_1_2_SONDES"
    pour essayer de récupérer ton résultat. Il faudra probablement te satisfaire d'un nom de fichier image comme ""PACEMAKER_DAI_1_2_SONDES.jpg" parce que c'est plus simple (paste0(cet_acte,".jpg")) et d'un titre moins joli aussi (tu peux au moment du titre remplacer les _ par des espaces avec chartr par exemple).
    Bon courage.
    Olivier

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Physicienne Médicale
    Inscrit en
    Mai 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Physicienne Médicale

    Informations forums :
    Inscription : Mai 2019
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Merci Olivier pour ton aide, j'ai réussi à faire ce que je voulais grâce à tes explications et coups de pouce !!!
    Il y a un seul truc que je n'ai pas réussi à faire, c'est le saut de ligne pour le N = effectif.

    Ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    levels(test)
    paste0("N=",table(test))
    levels(test) <- paste(levels(test),
                          paste0("N=",table(test)),
                          sep="\n")
    Le sep="\n" me renvoie un texte (donc par exemple : Centre 1 \n N=30)
    Pour le moment j'ai mis tout à la suite en mettant comme séparateur : sep=" / "
    Si quelqu'un a une solution, je n'ai pas trouvé…

    Pour info, voici mon code final pour la boucle.
    J'ai un peu galéré pour les numéros d'établissement (numérique) que j'ai du finalement transformer en FACTOR pour que la formule fonctionne (la transformation en caractère ne fonctionnait pas non plus).

    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
    # répertoire de sauvegarde :
    setwd("P:/2017 GT NR Bloc opératoire/Analyse R/ggsave/PDS_Acte_Centres")
     
    for (cet_acte in unique(RECUEIL$Acte)){
       # ici vient tout le code pour filtrer les données, créer le graphique et le sauvegarder
     
    DFacte <- RECUEIL[RECUEIL$Acte==cet_acte,]
     
    # Ajout d’une colonne Centre + Effectif N
     
    #Transformation des numéros des centres en FACTOR :
    DFacte$Num_etablissement <- as.factor(DFacte$Num_etablissement)
    Num_etablissementEff= DFacte$Num_etablissement
    DFacte <- cbind(DFacte,Num_etablissementEff)
     
    #Transformation des numéros des centres en FACTOR (avec ajout de « C » pour « centre » + son numéro)
    DFacte$Num_etablissementEff <- paste("C", DFacte$Num_etablissementEff ,sep=" ")
    DFacte$Num_etablissementEff <- as.factor(DFacte$Num_etablissementEff)
    levels(DFacte$Num_etablissementEff) <- paste(levels(DFacte$Num_etablissementEff), paste0("N=",table(DFacte$Num_etablissement)),sep=" / ")
     
    # Création du BOXPLOT:
     
    ggplot(DFacte)  +  aes(x=Num_etablissementEff,y=PDS_Total_corrigé_Gy.cm2) + geom_boxplot(alpha=0.7, varwidth=TRUE) + ggtitle(chartr("_", " " ,cet_acte))+xlab("")+ylab("PDS (Gy.cm²)")+ theme(plot.title = element_text(face="bold", colour = "blue", size = 12, hjust=0.5))+theme(axis.title.y = element_text(face="bold", colour = "black", size = 10))+ theme(axis.title.x = element_text(face="italic", colour = "black", size = 10)) + theme(axis.text.x =element_text(angle=45, hjust=1, colour="black", size = 7))
     
    # Sauvegarde du BOXPLOT:
     
    # extraire la spécialité
    Spe <- DFacte$Spécialité[1]
    ggsave(paste(Spe,paste0(cet_acte,".jpg"), sep="_"), device="jpg")
     
    # Effacer la DataFrame DFacte:
    rm(DFacte)
     
    }
    Et cela m'a généré autant de graphes que de nombre de graphe.
    Voici un exemple de graphe :

    Nom : exemple.JPG
Affichages : 1107
Taille : 31,2 Ko

    Merci beaucoup pour l'aide !
    A bientôt
    Matou

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Demande explication sur boucle itérative et factorielle
    Par ptitjoz dans le forum Général Python
    Réponses: 5
    Dernier message: 12/10/2018, 18h45
  2. [XL-2016] Création graphes avec macro sur plusieurs feuilles ?
    Par zapan09 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/04/2016, 16h34
  3. Boucle sur une variable et création nouveau champ
    Par Lipuvet dans le forum SAS Base
    Réponses: 2
    Dernier message: 18/08/2014, 16h02
  4. Boucle sur une variable et création nouveau champ
    Par Lipuvet dans le forum SAS Base
    Réponses: 0
    Dernier message: 14/08/2014, 20h01
  5. mettre les effectifs sur les barres d'un graphe en pile
    Par cocotta dans le forum SAS Base
    Réponses: 0
    Dernier message: 11/05/2010, 10h27

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