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 :

Faire une boucle générant des graphiques simples de séries temporelles


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 3
    Par défaut Faire une boucle générant des graphiques simples de séries temporelles
    Bonjour,
    j'ai une base de données appelée 'base1' ressemblant à ceci :

    Nom : Capture.PNG
Affichages : 1594
Taille : 16,8 Ko

    Il y'a 4 colonnes : la 1 sert comme date en x et de 2:4 trois graphiques devraient être générés, chacun en fonction de la date.

    Voici mon graphique pour la variable en colonne 2 qui fonctionne parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    library(ggplot2)
    library(scales)
    ggplot(base1, aes(x = Date, y = PrixIndiceG_NewF)) +
      geom_line(color = "indianred3", 
                size=1 ) +
      geom_smooth() +
      labs(title = "Titre",
           subtitle = "2017 à 2020",
           x = "Date",
           y = "Nom de la variable") +
      theme_minimal()
    Pour ma boucle, j'ai essayé plusieurs choses :

    1) une fonction qui n'a pas marché :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    plotTimeseries = function(x, na.rm = TRUE) {
      nm = names(x)
      for (i in 2:4) {
        print(ggplot(x, aes(x=Date,y=nm[i] ) + geom_line()+
      geom_smooth())
        }
    }
    plotTimeseries(base1)

    2) Une loop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    plots=list()
    for (i in 2:4){
    plots=ggplot(base1[,i], aes(x=Date,y=base1[,i]) + geom_line()+
      geom_smooth()
    }
    print(plots)
    Aucune ne fonctionne, svp avez-vous des idées ?

    Merci

  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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Bonjour.
    Quand tu as un paramètre comme un nom de variable à intégrer dans {ggplot2}, une solution est de remplacer la fonction aes par aes_string qui attend des arguments sous forme de textes.
    Dans ta solution 1, ça donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aes_string(x="Date",y=nm[i])
    Par contre je ne vois pas vraiment à quoi sert de faire une fonction. Est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nm = names(base1)
      for (i in 2:4) {
        print(ggplot(base1, aes_string(x="Date",y=nm[i]) ) + geom_line()+
      geom_smooth())
        }
    n'est pas suffisant ?


    Encore une autre solution, sans boucle : 1) transformer tes données avec tidyr::pivot_longer pour que les colonnes 2 à 4 deviennent autant de lignes ; tu aurais donc 3 fois plus de lignes qu'au départ dans ton nouveau data.frame. Puis 2) tu fais un seul ggplot sur ces données, avec un facet_wrap sur la colonne contenant l'ancien nom de variable. Ainsi tu génères tes trois graphiques, qui peuvent être sur la même image, avec des axes en commun (ou pas) et donc comparables.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 3
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse. Je voulais faire une fonction parce que j'ai plein de graphiques de ce type dans d'autres bases à tracer.

    Cependant j'ai encore une question dans votre 2ème solution. Il marche parfaitement mais si jamais j'oublie d'utiliser le aes_string, quelle est la solution dans ce cas ? J'ai essayé de modifier légèrement votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      for (i in 2:4) {
        print(ggplot(base1, aes(x=Date,y=i) + geom_line()+
      geom_smooth())
        }
    Ce code génère bien 3 graphiques mais je ne vois quasiment rien à part une ligne bleu, pourquoi ? Quelle aurait été la solution dans ce cas ?


    Par ailleurs avant j'enregistrais mes graphs de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        png(filename = "testgraphs.png", width = 480, height = 480)#Ouverture
        .... graphs
        dev.off()#Fermeture
    Cette solution m'enregistre un seul graphique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    nm = names(base1)
      for (i in 2:4) {
        png(filename = "testgraphs.png", width = 480, height = 480)#Ouverture
        print(ggplot(base1, aes_string(x="Date",y=nm[i]) ) + geom_line(color = "indianred3", 
                size=1)+
      geom_smooth()
      + theme_minimal())
        dev.off()#Fermeture
      }
    Avez vous une idée pour automatiser ça ? j'aimerai bien introduire le [i] dans la ligne de sauvegarde du fichier png mais je ne vois pas comment.

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ....
    png(filename =paste0( "testgraphs",i,".png"), width = 480, height = 480)
    ...

Discussions similaires

  1. Faire une boucle sur des OptionButton d'une feuille dans une userform
    Par Marty57070 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/06/2015, 07h23
  2. [XL-2010] Fair une boucle sur des objets Ranges
    Par Escorpion dans le forum Excel
    Réponses: 6
    Dernier message: 18/03/2015, 18h14
  3. [PHP 5.0] Faire une boucle pour des noms de variable
    Par lonyc dans le forum Langage
    Réponses: 2
    Dernier message: 09/12/2009, 17h19
  4. Faire une boucle sur des labels ou textBox
    Par Actarusdu60 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/12/2008, 18h17
  5. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33

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