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 :

Boxplot en filtrant les données selon une colonne donnée


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 Boxplot en filtrant les données selon une colonne donnée
    Bonjour,
    Débutante avec R...

    Je réalise un boxplot sur un dataset de données mais je souhaiterai filtrer les données et réaliser plusieurs boxplot pour séparer les données (je ne sais pas comment m'y prendre).
    Le boxplot est réalisé sur la donnée "PDS" qui est la dose de RX délivrée pour un "acte" chirurgical.
    Dans mon tableau j'ai également une autre colonne qui spécifie la spécialité "Spe" chirurgicale et je voudrais filtrer par les données de cette colonne.
    Comment faire ?

    Voici les données de mon Dataset :
    'data.frame': 8156 obs. :
    ….
    $ Spe : Factor w/ 9 levels "AUTRES","CARDIOLOGIE",..: 9 9 9 9 9 9 9 9 9 9 ...
    $ Acte : Factor w/ 44 levels "ARTERIO_MEMBRES_INF",..: 5 5 5 5 5 5 5 5 5 5 ...
    $ PDS : num 1.7 2.77 2.7 5.18 7.82 ...
    …..


    Et voici comment je réalise mon Boxplot pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Boxplot(PDS~Acte, data=Dataset, id=list(method="y"),ylim=c(0,20),las=2,cex.axis=0.5, ylab="PDS(Gy.cm²)")
    Mais j'ai besoin de faire plusieurs boxplot selon la colonne "Spe" qui regroupent 8 spécialités au bloc opératoire.
    Je pensais essayer de filtrer pour faire mes 8 spécialités une par une avec un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Boxplot(PDS~Acte + filter(Spe=="ORTHOPEDIE"), data=Dataset, id=list(method="y"),ylim=c(0,20),las=2,cex.axis=0.5, ylab="PDS(Gy.cm²)")
    Mais cela ne marche pas….

    Le top serait de faire 8 boxplot directement avec mes 8 spécialités chirurgicales…
    Y a t-il un moyen ou une piste ?

    Merci
    Matou06

    Voici mon boxplot :
    Nom : Capture.JPG
Affichages : 764
Taille : 111,8 Ko

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 72
    Points : 180
    Points
    180
    Par défaut
    bonjour,

    avec le package ggplot2 il y a moyen de faire cela avec la fonction facet_wrap.

    La question est de savoir si les valeurs des abscisses sont les mêmes (ou à peu près) dans toutes les catégories de Spé.

    VV

  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 VonVelten, je vais essayer de trouver avec cette piste.

    Les abscisses sont quasi toutes différentes d'une spécialités à l'autre :
    exemples :
    Spé Neurologie => abscisses = (hernie lombaire, arthrodèse, …)
    Spé Urologie => abscisses = (Sonde JJ, etc...)
    Etc

    Matou06


    Citation Envoyé par VonVelten Voir le message
    bonjour,

    avec le package ggplot2 il y a moyen de faire cela avec la fonction facet_wrap.

    La question est de savoir si les valeurs des abscisses sont les mêmes (ou à peu près) dans toutes les catégories de Spé.

    VV

  4. #4
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Bonjour Matou06

    VonVelton a dit vrai. exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    d <- data.frame(
        Spe  = rep(seq(1:9)),
        Acte = rep(seq(1:44)),
        PDS  = rnorm(9*44*10,mean = 5,sd = 1.5)
    )
     
    library(ggplot2)
     
    ggplot(d) +
        aes(x = as.factor(Acte), y = PDS) +
        geom_boxplot(alpha = 0.7) +
        facet_wrap(~ Spe) + # Rupture des graphiques sur la variable Spe
        coord_flip() # fait pivoter X et Y
    Nom : vonvelten.png
Affichages : 724
Taille : 76,3 Ko

    Après pour faire un graphique seul (ex Spe 1), on peut faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d1 <- d[d$Spe == "1",]
    ggplot(d1) +
        aes(x = as.factor(Acte), y = PDS) +
        geom_boxplot(alpha = 0.7) +
        coord_flip() +
        ggtitle("Spe 1")
    Nom : Rplot10.png
Affichages : 715
Taille : 21,6 Ko

  5. #5
    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,

    J'ai testé selon les indications de Vonvelton et du code de Puppet_Master (merci) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ggplot(Dataset)+ aes(x=as.factor(Acte),y=PDS)+geom_boxplot(alpha=.1)+facet_wrap(~Spe)
    Et voici ce que j'obtiens :
    Nom : testR.jpg
Affichages : 710
Taille : 109,9 Ko

    Le problème est que mes actes peuvent être très différents d'une spécialité à l'autre, donc je me retrouve à avoir en abscisse tous les actes, même si la spécialité du graphique n'est pas concernée, du coup l'abscisse est illisible.

    Une piste pour solutionner ce problème ?

    Merci
    Matou06

  6. #6
    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
    Re,

    J'ai aussi testé la seconde méthode de Puppet_Master qui fonctionne bien (encore merci).
    Mais il est nécessaire de modifier l'écriture des abscisses pour la lisibilité, comment faire ?
    J'ai testé avec las=2 (utilisé dans la fonction boxplot pour une écriture verticale) mais qui ne fonctionne pas.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cardio <- Dataset[Dataset$Spe== "CARDIOLOGIE",]
    ggplot(cardio) +  aes(x=as.factor(Acte),y=PDS)+geom_boxplot(alpha=0.7) + ggtitle("CARDIOLOGIE")
    qui donne :
    Nom : TestRCardio.png
Affichages : 716
Taille : 20,4 Ko

    Et question subsidiaire : comment enregistrer le graphe créé automatiquement vers un fichier image (jpeg ou autre) ? Le but étant d'écrire mon code pour toutes les spécialités et d'enregistrer au fur et à mesure le graphe résultant.

    Merci de vos conseils avertis.
    Excellente journée à tous.

    Matou06

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 72
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Pour répondre aux questions :

    Par rapport aux problèmes d’abscisses qui sont uniques dans chaque valeur de graphique, il est possible de faire quelque chose avec la fonction multiplot() (dont le code est accessible ici) en utilisant la solution de faire un graphique à la fois comme proposé par Puppet_Master, et de les combiner à la fin avec la fonction multiplot().


    Par rapport à la lecture, on peut jouer sur l'orientation du texte :

    Code R : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ggplot(cardio) +  aes(x=as.factor(Acte),y=PDS)+geom_boxplot(alpha=0.7) + ggtitle("CARDIOLOGIE")+theme(axis.text.x = element_text(angle = 90))

    Je pense que la fonction las ne fonctionne pas car elle est liée à boxplot et non à ggplot (pas même outil graphique).


    Pour enregister, deux possibilités :
    - Si les graphiques sont réalisées avec ggplot, il y a la fonction ggsave() (aide en ligne). Je la trouve très bien car elle permet de bien choisir taille/format/résolution facilement (La visualisation dans R et le rendu final peuvent être différent à cause des changements de taille). Attention pour le multiplot, il faut faire ggsave(multiplot(....),....).
    - Sinon, pour sauver de façon générale la fenêtre graphique, il y a la fonction png() par exemple (pour sauver en png) et à associer à la fin avec dev.off (Voici les principales fonctions)

    Cordialement

    VV

  8. #8
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Citation Envoyé par Matou06 Voir le message
    Bonjour,

    Le problème est que mes actes peuvent être très différents d'une spécialité à l'autre, donc je me retrouve à avoir en abscisse tous les actes, même si la spécialité du graphique n'est pas concernée, du coup l'abscisse est illisible.

    Une piste pour solutionner ce problème ?

    Bonjour.



    La documentation de ggplot2 section facet_warp propose l'utilisation de l'argument scales pour ce genre de problème. exemple:

    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
    # Initialisation des variables de construction du data.frame
    S <- seq(1:9)
    Acte <- NULL
    Spe <- NULL
    for(i in S){
        Spe <- c(Spe, rep(i,44*10))
        Acte <- c(Acte, round(runif(n = 44*10, min = i * 9 , max = i*9+5 ), 0))
    }
     
    # Construction du data.frame
    d <- data.frame(
        Spe  = Spe,
        Acte = Acte,
        PDS  = rnorm(9*44*10,mean = 5,sd = 1.5)
    )
     
    # Faire les graphiques
    library(ggplot2)
     
    ggplot(d) +
        aes(x = as.factor(Acte), y = PDS) +
        geom_boxplot(alpha = 0.7) +
        facet_wrap(~ Spe, scales = "free")
    Nom : Rplot11.png
Affichages : 708
Taille : 38,1 Ko

  9. #9
    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 énormément d'avoir pris de votre temps pour partager vos savoir faire.
    Je me suis servi de toutes vos pistes et j'ai réussi à sortir des graphes vraiment intéressants (même s'il y a sûrement encore moyen de faire mieux), ainsi qu'à les sauvegarder.

    Pour info, voici mes codes (un exemple pour une spécialité, j'ai fait le même pour chaque spécialité (il y a peut être moyen de faire une boucle pour éviter de tout retaper bêtement mais je n'ai pas encore chercher à le faire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cardio <- RECUEIL[RECUEIL$Spécialité== "CARDIOLOGIE",]
    ggplot(cardio)  +  aes(x=Acte,y= PDS_Total_corrigé_Gy.cm2)  + geom_boxplot(alpha=0.7)  + ggtitle("CARDIOLOGIE") + 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("cardio.jpg")
    Et voici ce que ça donne :
    Nom : cardio.jpg
Affichages : 742
Taille : 290,1 Ko

    Et pour avoir un graphe complet (encore à améliorer), voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ggplot(RECUEIL) + aes(x = as.factor(Acte), y = PDS_Total_corrigé_Gy.cm2) + geom_boxplot(alpha = 0.7) +    facet_wrap(~ Spécialité, scales = "free", ncol=3) + theme(axis.text.x = element_text(angle=45, size=5, hjust=1))
    ggsave("global.jpg")
    Et le résultat :
    Nom : global.jpg
Affichages : 704
Taille : 552,2 Ko

    J'ai également tester le multiplot, ça fonctionne aussi…

    Il ne me reste plus qu'à apprendre à mettre du code dans une macro (modifiable) pour pouvoir le faire plus rapidement, je suppose que c'est faisable…
    A bientôt, et encore merci pour votre aide précieuse !

    Matou

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/07/2011, 15h25
  2. [XL-2003] Filtre selon les modalités d'une colonne
    Par doncamelo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/11/2009, 00h18
  3. [XL-2003] Compter les occurences selon une condition sur une autre colonne
    Par juvamine dans le forum Excel
    Réponses: 4
    Dernier message: 13/05/2009, 11h08
  4. [SQL] Comment construire une requête filtrant les données ?
    Par glasgow dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/02/2008, 14h57
  5. supprimer les doublons . . . . d'une colonne donnée !
    Par pekka77 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/10/2006, 17h38

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