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

PyQt Python Discussion :

Widget MatplotLib : problème d'affichage


Sujet :

PyQt Python

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut Widget MatplotLib : problème d'affichage
    Bonjour,

    j'ai créé une IHM via QtDesigner incluant un widget QTableWidget (nommé "tableValeurs") et un widget MatplotlibWidget (nommé "matplotlibWidget").
    Je souhaite afficher des lignes dans ce widget mais la figure reste vide, rien ne s'affiche...
    Voici mon code:

    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
    import sys, os
    from PyQt4 import QtGui
    from PyQt4 import QtCore
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    import IHM.IHM_MaFenetre
     
    class MaFenetre(QtGui.QDialog, IHM.IHM_MaFenetre.Ui_MaFenetre):
        def __init__(self, parent=None):
            '''
            Constructeur de MaFenetre
            '''
            # Initialisation de l'IHM
            super(MaFenetre, self).__init__()
            self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre()
            self.ui.setupUi(self)
     
            # Initialisation du matplotlib widget
            self.ui.matplotlibWidget.figure = plt.Figure(facecolor='white')
            self.ui.matplotlibWidget.canvas = FigureCanvas(self.ui.matplotlibWidget.figure)
            self.ui.matplotlibWidget.axes = self.ui.matplotlibWidget.figure.add_subplot(111)
     
            # Le SLOT "updateGraphe" est appelé lorsque l'utilisateur modifie une valeur dans le QTableWidget
            self.ui.tableValeurs.cellChanged.connect(self.updateGraphe)
     
            def updateGraphe(self):
                '''
                Mise a jour du graphe en fonction des valeurs du tableau
                Ici avec des valeurs fixes pour test
                '''
                # Reinitialisation du graphe
                self.ui.matplotlibWidget.axes.cla()
                self.ui.matplotlibWidget.axes.hold(True)
     
                # Dessin des lignes
                hlineLarg = self.ui.matplotlibWidget.axes.axhline(y=0, xmin=1, xmax = 2)
                hlineMid = self.ui.matplotlibWidget.axes.axhline(y=0.5, xmin=2, xmax = 3)
                hlineEcart = self.ui.matplotlibWidget.axes.axhline(y=1, xmin=3, xmax = 4)
                self.ui.matplotlibWidget.axes.add_artist(hlineLarg)
                self.ui.matplotlibWidget.axes.add_artist(hlineMid)
                self.ui.matplotlibWidget.axes.add_artist(hlineEcart)
     
               # Affichage du graphe
               self.ui.matplotlibWidget.canvas.draw()
    Je ne maîtrise pas encore très bien matplotlib, en tout cas je ne vois pas ce qui cloche et pourquoi mes lignes ne s'affichent pas!
    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Et en ajoutant après le draw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.ui.matplotlibWidget.canvas.plot(***)
    self.ui.matplotlibWidget.canvas.show()
    en mettant quelque chose dans le plot.

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci de ta réponse,

    cependant cela ne fonctionne pas pour moi,
    en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ui.matplotlibWidget.canvas.plot([0,0])
    J'ai un message "AttributeError: 'FigureCanvasQTAgg' object has no attribute 'plot'.

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.ui.matplotlibWidget.axes.plot([0,0])
    self.ui.matplotlibWidget.canvas.show()
    Ma fenêtre s'ouvre sans erreur, mais j'ai également une nouvelle sous-fenêtre contenant uniquement le matplotlibWidget, tout reste vide (dans ma fenêtre et dans la nouvelle sous-fenêtre).

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je ne sais pas tester parce que je ne vois pas d'où tu sors ce matplotlibWidget, il ne semble pas exister dans les packages de ma distrib.

    Quoiqu'il en soit, il y a tout de même des choses étranges dans ta construction.
    Tu dis que tu as créé la fenêtre principale avec le Designer. Est-ce une MainWindow, un QWidget, QDialog ?

    Qu'est-ce que la classe MaFenetre, pourquoi hérite-t-elle d'abord de QDialog alors que ce n'en est manifestement pas un et aussi de IHM.IHM_MaFenetre.Ui_MaFenetre alors qu'une classe ne peut hériter de deux classe Qt ? Et d'autant plus que tu utilises self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre() ce qui n'a pas de sens.

    On peut voir le code de IHM.IHM_MaFenetre.Ui_MaFenetre ? Histoire de comprendre comment est implémenté ta fenêtre principale.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    J'ai les mêmes problèmes que VinsS. Cela dit, d'après ce que je comprends du code (un problème d'utilisation de matplotlib), je peux proposer un exemple avec Tk :

    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
    # -*- coding: utf-8 -*-
     
    import matplotlib
    matplotlib.use('TkAgg')
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg as FigureCanvas
    from matplotlib.figure import Figure
    import numpy as np
    import tkinter as tk
     
     
    def press(event=None):
        global idx
        if event.key == "left" and idx > 0:
            idx -= 1
        elif event.key == "right" and idx < np.size(w) - 1:
            idx += 1
        else:
            return
        lines.set_ydata(func(idx))
        root.title("w = {:5.2f}".format(w[idx]))
        canvas.show()
     
     
    if __name__ == '__main__':
        root = tk.Tk()
     
        t = np.linspace(0, 6 * np.pi, 512)
        w = np.arange(2.0, 5.0, 0.2)
        func = lambda index: np.cos(w[index] * t)
     
        figure = Figure(figsize=(5, 4), dpi=100)
     
        axes = figure.add_subplot(111)
        idx = 0
        lines, = axes.plot(t, func(idx))
     
        canvas = FigureCanvas(figure, master=root)
        canvas.show()
        canvas.get_tk_widget().pack()
        canvas.mpl_connect('key_press_event', press)
     
        root.title("w = {:5.2f}".format(w[idx]))
        root.mainloop()
    Les étapes doivent être les mêmes avec Qt (je dis ça mais en fait je n'utilise pas Qt).

  6. #6
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci de vos réponses,
    en fait j'utilise PythonXY, qui inclut python2.7 et Qt4.8. C'est une distribution python orientée pour le domaine scientifique.
    En effet je n'avais pas vu mais le widget MatplotLibWidget est spécifique à pythonXY, j'ai ce widget de disponible dans ma version de QtDesigner dans une catégorie "PythonXY". Du coup je suis désolée je ne sais pas comment vous pouvez faire pour tester j'ai trouvé ça mais je ne sais pas ce que ça vaut: http://wiki.scipy.org/Cookbook/Matpl...n_and_Designer

    Pour ce qui est de la structure de mon code je vais détailler un peu, en fait MaFenetre est une sous-fenêtre de mon application principale. MaFenetre est un QDialog.
    Voilà comment je l'ai créée:
    - J'ai créé un QDialog dans QtDesigner. J'ai nommé ce QDialog "MaFenetre".
    - J'ai enregistré le fichier ui dans un dossier nommé "IHM". Mon fichier ui se nomme IHM_MaFenetre.ui,
    - j'ai utilisé la commande pyuic4 pour générer un fichier python à partir du fichier ui. J'ai donc un fichier IHM_MaFenetre.py dans le dossier IHM.
    - ce fichier python contient la classe Ui_MaFenetre contenant elle même la méthode setupUi. Voilà le code du fichier IHM_MaFenetre.py, ce n'est pas mon vrai code car je ne peux pas le divulger mais j'ai adapté:

    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'C:\Users\Prenom\monProjet\IHM\IHM_MaFenetre.ui'
    #
    # Created: Tue Feb 11 15:03:17 2014
    #      by: PyQt4 UI code generator 4.9.5
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s
     
    class Ui_MaFenetre(object):
        def setupUi(self, MaFenetre):
            MaFenetre.setObjectName(_fromUtf8("MaFenetre"))
            MaFenetre.setWindowModality(QtCore.Qt.ApplicationModal)
            MaFenetre.resize(568, 486)
     
            self.table_valeurs = QtGui.QTableWidget(MaFenetre)
            self.table_valeurs.setMinimumSize(QtCore.QSize(203, 0))
            self.table_valeurs.setMaximumSize(QtCore.QSize(200, 16777215))
            self.table_valeurs.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.table_valeurs.setObjectName(_fromUtf8("table_valeurs"))
     
            self.matplotlibWidget = MatplotlibWidget(MaFenetre)
            self.matplotlibWidget.setMinimumSize(QtCore.QSize(0, 70))
            self.matplotlibWidget.setObjectName(_fromUtf8("matplotlibWidget"))
            self.gridLayout_4.addWidget(self.matplotlibWidget, 0, 0, 1, 1)
            self.gridLayout_5.addWidget(self.gb_graphe, 2, 0, 1, 2)
     
            self.buttonBox = QtGui.QDialogButtonBox(MaFenetre)
            self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
            self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
            self.gridLayout_5.addWidget(self.buttonBox, 3, 1, 1, 1)
     
    from matplotlibwidget import MatplotlibWidget
    Ensuite, j'ai créé un nouveau fichier python dans le dossier parent de "IHM", nommé GestionMaFenetre.py. C'est le fichier que je vous ai montré au départ. Sauf que en effet l'héritage avec IHM.IHM_MaFenetre.Ui_MaFenetre n'a rien à faire là c'est une erreur de ma part! De plus je vais renommer cette classe en GestionMaFenetre car le nom porte à confusion.

    J'ai donc:
    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
    import sys, os
    from PyQt4 import QtGui
    from PyQt4 import QtCore
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    import IHM.IHM_MaFenetre
     
    class GestionMaFenetre(QtGui.QDialog):
        def __init__(self, parent=None):
            '''
            Constructeur de GestionMaFenetre
            '''
            # Initialisation de l'IHM
            super(GestionMaFenetre, self).__init__()
            self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre()
            self.ui.setupUi(self)
     
            # Initialisation du matplotlib widget
            self.ui.matplotlibWidget.figure = plt.Figure(facecolor='white')
            self.ui.matplotlibWidget.canvas = FigureCanvas(self.ui.matplotlibWidget.figure)
            self.ui.matplotlibWidget.axes = self.ui.matplotlibWidget.figure.add_subplot(111)
     
            # Le SLOT "updateGraphe" est appelé lorsque l'utilisateur modifie une valeur dans le QTableWidget
            self.ui.tableValeurs.cellChanged.connect(self.updateGraphe)
     
            def updateGraphe(self):
                '''
                Mise a jour du graphe en fonction des valeurs du tableau
                Ici avec des valeurs fixes pour test
                '''
                # Reinitialisation du graphe
                self.ui.matplotlibWidget.axes.cla()
                self.ui.matplotlibWidget.axes.hold(True)
     
                # Dessin des lignes
                hlineLarg = self.ui.matplotlibWidget.axes.axhline(y=0, xmin=1, xmax = 2)
                hlineMid = self.ui.matplotlibWidget.axes.axhline(y=0.5, xmin=2, xmax = 3)
                hlineEcart = self.ui.matplotlibWidget.axes.axhline(y=1, xmin=3, xmax = 4)
                self.ui.matplotlibWidget.axes.add_artist(hlineLarg)
                self.ui.matplotlibWidget.axes.add_artist(hlineMid)
                self.ui.matplotlibWidget.axes.add_artist(hlineEcart)
     
               # Affichage du graphe
               self.ui.matplotlibWidget.canvas.draw()
    Voilà j'espère avoir apporté les explications qu'il vous fallait. VinsS pourquoi dis tu que "self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre()" n'a aucun sens? Comment accéder aux différents widgets de ma fenêtre dans ce cas? Je ne comprends pas.

    En fait mon problème est apparu depuis que je tente de dessiner des lignes avec axhline(). Avant j'utilisais plot() avec des valeurs aléatoires pour tester et le graphe s'affichait bien. Sauf qu'en réalité je veux représenter un chronogramme, et depuis que j'ai remplacé le plot() par add_artist() plus rien ne s'affiche.

    Je vais continuer à chercher de mon côté
    Images attachées Images attachées  

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est bon je comprend mieux.

    Si je disais que ça n'avait pas de sens c'était par rapport au double héritage mais si tu enlèves ce deuxième héritage c'est bon.

    J'ai essayé avec un des scripts privés matplotlibWidget que l'on trouve sur le web et je n'obtiens pas de tracé non plus avec add_artist().

    Tu es sûre que tu ne peux pas le remplacer par plot(), les exemples ne manquent pas de ce côté là.

  8. #8
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    J'aimerais bien remplacer par plot() mais je ne vois pas comment tracer le chronogramme...
    Parce que du coup pour certaines valeurs de X j'ai deux valeurs Y (lignes verticales de mon chronogramme).
    Je vais essayer de trouver une solution sans utiliser add_artist, en attendant si quelqu'un a déjà du tracer ce genre de graphe je suis preneuse de vos conseils.
    Je reviens vers vous si je trouve une solution!

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Les lignes créées avec axhline se placent sur axes avec un add_line. Mais les valeurs utilisées par axhline ne sont pas dans les mêmes unités que celles des axes. Elles renvoient aux dimensions de la figure (1 correspondant à la largeur|hauteur maximale).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import matplotlib.pyplot as plt
     
    figure = plt.figure()
     
    axes = figure.add_subplot(111)
    axes.set_xlim([0, 4])
     
    hlineLarg = axes.axhline(y=0.5, xmin=0.5, xmax=0.75)
    axes.add_line(hlineLarg)
     
    plt.show()
    De là à construire un chronogramme, il y a du travail. Je ne comprends pas pourquoi tu veux remplacer le plot. Je ne vois pas comment faire autrement, simplement.

  10. #10
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci pour le "add_line" je vais tester ça,
    Ce n'est pas que je veux remplacer le plot(), j'aimerais bien l'utiliser mais je ne vois pas comment!
    Si tu as un exemple de tracé de chronogramme avec plot() cela m'intéresse.

  11. #11
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    On ne doit pas parler de la même chose. Qu’entends-tu par chronogramme ?
    Je pensais que l’appel par défaut de plot devait suffire – à la rigueur avec l’attribut drawstyle='steps-post'.
    Tu devrais préciser l’organisation des données, parce que là, je ne vois pas la difficulté.

  12. #12
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Tout simplement... je n'avais pas vu cette option drawstyle='step' c'était juste de ça dont j'avais besoin!
    En effet il n'y avait pas de difficulté

    En gros je ne voyais pas comment avoir le signal avec plot, pour moi ça donnait forcément ça:
    Nom : plot_sans_step.JPG
Affichages : 1627
Taille : 16,1 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ui.matplotlibWidget.axes.plot([0, 1, 2, 3, 4], [0,1,0,1,0], color='blue', linewidth=3)

    Et effectivement en ajoutant simplement l'option step j'ai bien un signal comme je voulais:
    Nom : plot_avec_step.JPG
Affichages : 1813
Taille : 13,4 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ui.matplotlibWidget.axes.plot([0, 1, 2, 3, 4], [0,1,0,1,0], color='blue', linewidth=3, drawstyle='steps')
    Merci beaucoup!

  13. #13
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Je reviens vers vous car j'ai un autre problème,
    mon graphe ne se met pas à jour lorsque je change une valeur dans table_valeurs.
    La méthode "updateGraphe" est bien appelée mais le graphe ne change pas.
    Par contre lorsque je ferme puis ré-ouvre ma fenêtre, là le graphe se met bien à jour.

    Comment faire pour actualiser le graphe sans avoir à redémarrer la fenêtre?
    J'avais compris que la commande self.matplotlibwidget.canvas.draw() faisait cette réactualisation mais ça n'a pas l'air de fonctionner...

    Merci

  14. #14
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Il y a des éléments de réponse dans le message #5.

    Ça dépend des configurations, mais sur mon poste, il est nécessaire d'appeler show pour mettre à jour, après l'appel à set_ydata, sinon le graphe ne change pas (draw trace mais n'affiche pas). Mais je ne connais pas PythonXY.

    Si ça ne marche toujours pas, tu peux nettoyer le graphe (axes.clear() dans l'exemple), et refaire un nouvel appel à plot.

  15. #15
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Et bien pas moyen d'y arriver!
    J'ai essayé:

    Dans la méthode __init__
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    self.ui.matplotlibWidget.figure = plt.Figure(facecolor='white')
    self.ui.matplotlibWidget.canvas = FigureCanvas(self.ui.matplotlibWidget.figure)
    self.ui.matplotlibWidget.axes = self.ui.matplotlibWidget.figure.add_subplot(111)
    self.ui.matplotlibWidget.axes.tick_params(axis='both', which='both', width=0, labelbottom=False, labelleft=False)
    self.graphe, = self.ui.matplotlibWidget.axes.plot([], [], color='blue', linewidth=3, drawstyle='steps')
    Dans la méthode updateGraphe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.graphe.set_data(valeursX, valeursY)
    self.ui.matplotlibWidget.canvas.draw()
    ça ne fonctionne pas (le graphe ne se met toujours pas à jour). J'ai testé également l'appel à axes.clear() avec le rappel à plot() mais ça n'a rien changé non plus...

  16. #16
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut.
    Il y a une erreur à la création de self.graphe. L'appel à plot se fait avec des listes vides. Du coup, l'appel à set_data dans updateGraphe doit normalement lever une erreur. Mais si tu as essayé avec clear et un nouvel appel à plot, le problème ne vient pas de là.
    D'ailleurs, il faut appeler show et pas draw pour afficher (à moins d'être en mode interactif).

    C'est difficile de t'aider sans pouvoir reproduire le problème. Je pense que tu devrais poster l'ensemble du code, pour que les utilisateurs de PythonXY et de matplotlib puissent d'aider.

  17. #17
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Salut,
    finalement j'ai préféré opter pour une solution qui n'utilise pas le widget MatplotLib:
    dans QtDesigner j'ai remplacé ce widget par un simple QLayout que j'ai nommé gridLayoutPlot. Ce layout est intégré dans un QGroupBox nommé gb_graphe.
    Comme ça je m'affranchis de ce widget MatplotlibWidget qui n'est présent qu'avec pythonXY.
    Ensuite j'ai modifié mon code de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    Dans ma méthode __init__:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Initialisation du graphe
    fig = plt.Figure(facecolor='white')
    self.canvas = FigureCanvas(fig)
    self.canvas.setParent(self.ui.gb_graphe)
    self.axes = fig.add_subplot(111)
    Dans ma méthode updateGraphe (appelée lorsque je change une valeur dans le QTableWidget de mon IHM):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Calcul des tableaux valeursX et valeursY en fonction des valeurs entrées sur l'IHM
    ...
    # Mise a jour du graphe
    self.axes.clear()
    self.axes.plot(valeursX, valeursY, color='blue', linewidth=3, drawstyle='steps')
    self.canvas.draw()
    self.ui.gridLayoutPlot.addWidget(self.canvas, 0, 0, 1, 1)
    Ainsi cela fonctionne bien.
    Qu'en pensez-vous? Cette solution est bonne pour vous?

  18. #18
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut

    Bonne initiative que d'avoir supprimer la dépendance à PythonXY.
    En nettoyant l'axe à chaque appel, tu n'est pas embêtée par la gestion des objets matplotlib. Mais du coup, tu ne peux tracer qu'un seul chronogramme à la fois.

  19. #19
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Ce n'est pas grave j'ai besoin de tracer un seul graphe
    Merci pour ton aide!

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

Discussions similaires

  1. android.widget.imageview probléme affichage
    Par chlock62 dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 11/03/2014, 17h33
  2. Problème d'affichage de widget
    Par ze_dark dans le forum Débuter
    Réponses: 2
    Dernier message: 19/01/2011, 15h55
  3. Graphique avec matplotlib, probléme d'affichage des boutons
    Par astragoth dans le forum Général Python
    Réponses: 0
    Dernier message: 08/04/2010, 08h27
  4. QTabWidget - Problème d'affichage des widgets
    Par jimaitou dans le forum Débuter
    Réponses: 7
    Dernier message: 22/03/2009, 02h55
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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