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

Python Discussion :

subplot dans une boucle ? [Python 2.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut subplot dans une boucle ?
    Bonjour tous,

    j'utilise souvent des plot dans des boucles lorsque je traite mes données avec un code de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    numFig="ma figure 1"
    fig1=plt.figure(numFig)
    ax=fig1.add_axes([0.13, 0.1, 0.83, 0.8])
    ax.plot(x,y,style[i],label=legendName[i])
    et ça fonctionne très bien : toutes les données que je traite dans la boucles sont plottés sur sur la même figure qui porte le nom "ma figure 1"

    Maintenant,lorsque je veux faire la même chose mais dans des subplot je fais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    numFig,(ax1,ax2)=plt.subplots(nrows=1, ncols=2)
    fig1=plt.figure(numFig)
    ax1=fig1.add_axes([0.13, 0.1, 0.83, 0.8])
    ax1.plot(x,y,style[i],label=legendName[i])
    ax2=fig1.add_axes([0.13, 0.1, 0.83, 0.8])
    ax2.plot(x,y,style[i],label=legendName[i])
    des bouts de code de ce style fonctionnent très bien mais par contre :
    1- mes courbes ne sont pas mise dans la même figure car au cours de la boucle le numéro de figure "numFig" évolue automatiquement et je ne sais pas comment garder un numéro fixe
    2- je n'arrive pas non plus à donner à ma figure un nom "un string" lorsque je fais des subplot
    3- le dernier problème que j'ai et lorsque je fais des subplot les numéros sur mes abscisses ne sont pas visibles car python je choissis pas la notation scientifique : comment le forcer à faire ceci ? (cf. PJ)
    Pièce jointe 168426

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    J'espère que je vais pouvoir t'aider un peu. Déjà tu as quelques références matplotlib ICI.

    Sinon pour les problemes soulevés, sans code complet on ne peut t'aider pleinement, donc on va te donner au moins des pistes:
    1- Comme indiqué dans le lien donné, et comme tu l'a soulevé, il faut un numero fixe pour le numfig. Une constante ne peut-elle faire l'affaire?
    2- Il existe la methode title pour les plot. Un example ICI
    3- Contournement possible, tu peut orienter ton texte avec l'option "rotation". Un exemple ICI et ICI.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    super! merci beaucoup pour ta réponse!!!
    ce lien répond à ma question :
    http://matplotlib.org/examples/pylab...lot_demo2.html

    c'est la méthode "canvas" que je ne connaissais pas

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    en fait même en gardant un nom de figure constant ça ne fonctionne pas en subplot
    --> je n'arrive pas à superposer des courbes "y" et "z" lorsque j'utilise des subplot
    --> alors que lorsque j'utilise des figures simples ça fonctionne.

    Voici un cas test qui illustre mes problèmes :
    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
    #!/usr/bin/python
    # -*- coding: utf8 -*-
    import numpy as np
    import matplotlib.pyplot as plt
    colorVect=["bo-","r*-","k--","gx-"]
    x=np.linspace(0,6,20);
    y=[];y.append(np.sqrt(1*x));y.append(np.sqrt(2*x))
    z=[];z.append(np.exp(1*x));z.append(np.exp(2*x))
    for d in range(0,len(y),1):
        ### PLOT: plot ca fonctionne
        fig1=plt.figure("TEST-y-simple") 
        ax=fig1.add_axes([0.13, 0.1, 0.83, 0.8])
        ax.plot(x,y[d],colorVect[d],label=str(d))
        fig1=plt.figure("TEST-z-simple") 
        ax=fig1.add_axes([0.13, 0.1, 0.83, 0.8])
        ax.plot(x,z[d],colorVect[d],label=str(d))
        ### SUBPLOT: ca ne fonctionne pas
        numFig,(ax1,ax2)=plt.subplots(nrows=1, ncols=2)
        numFig.canvas.set_window_title("TEST-y-z-subplot")
        ax1.plot(x,y[d],colorVect[d],label=str(d))
        ax2.plot(x,z[d],colorVect[d],label=str(d))
    plt.show()
    sauriez vous comment éditer ce bout de code afin d'avoir une seule double figure avec y et z surperposés ?

  5. #5
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    D'après ce lien: http://matplotlib.org/users/pyplot_tutorial.html

    Il ne faut pas passer par une boucle FOR. Il faut créer avant la liste des coordonnées, puis créer la figure
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par deusyss Voir le message
    D'après ce lien: http://matplotlib.org/users/pyplot_tutorial.html
    Il ne faut pas passer par une boucle FOR. Il faut créer avant la liste des coordonnées, puis créer la figure
    - soit j'ai mal compris soit c'est grave pourris...

    - si j'ai bien je dois connaître la liste des graph avant et le bout sera code est fixe ? Pourtant mon nombre de plot dépendent du choix de l'utilisateur, ça veut donc dire que l'utilisateur doit à chaque choix reprogrammer les figures

    - Je vais voir si il y a pas un solution de secours car je peux pas me permettre de demander aux utilisateurs de mon code de reprogrammer à chaque fois la liste des figures

    si tu penses qu'il y a une solution pourrais tu me montrer comment modifier mon bout de code pour que ça fonctionne stp ?

  7. #7
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Je vais tâcher de jeter un coup d'oeil et de faire quelques essais je n'avais pas le temps pour cela hier soir).

    Néanmoins je ne connait pas plus que ça pyplot, utilisant de mon côté Figure. Il y a peut etre une subtilité que je n'ai pas vu.

    Mais sinon en général, on regenere la courbe oui.

    La suite ce soir me concernant Si tu trouves quelque chose d'ici là, merci de le poster pour tracer
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    c'est très gentil de prendre le temps de m'aider
    merci beaucoup

    EDIT :
    on vient de me donner un bout de code qui fonctionne, je t'en fais profiter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import numpy as np
    import matplotlib.pyplot as plt
    x=np.linspace(0,6,20);
    y=[];y.append(np.sqrt(1*x));y.append(np.sqrt(2*x))
    z=[];z.append(np.exp(1*x));z.append(np.exp(2*x))
    colorVect=["bo-","r*-","k--","gx-"]
    numFig,(ax1,ax2) = plt.subplots(nrows=1, ncols=2)
    numFig.canvas.set_window_title("TEST-y-z-subplot")
    for d in range(0,len(y),1):
        ax1.plot(x,y[d],colorVect[d],label=str(d))
        ax2.plot(x,z[d],colorVect[d],label=str(d))
    plt.show()
    c'est dans la même idée que ce que tu me disais mais par contre je peux garder la création du plot dans la boucle et ça m'intéresse vachement ça

    Si tu as d'autres idées je suis preneur mais en tout cas je mets le sujet en résolu. merci en tout cas pour ton aide

  9. #9
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    De rien, le forum est là pour ça, pour aider.

    Je ne pense pas que j'aurais mieux. J'ai trouvé la partie de la doc qui explique cela.

    En tout cas, heureux que tu ai enfin ta solution

    Bonne continuation
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

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

Discussions similaires

  1. subplot dans une boucle
    Par sanzorairfix dans le forum Général Python
    Réponses: 0
    Dernier message: 18/05/2015, 11h52
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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