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 :

Enregistrer un graphique avec matplotllib


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Enregistrer un graphique avec matplotllib
    Bonjour,
    ci dessous un code en PyQt5 qui intègre un graph de matplotlib.
    les valeurs qui remplissent le graphique sont des valeurs aléatoires (d'aucune utilité) mais à terme ce sera des valeurs issues d'un capteur.

    Le tout semble bien marché... avec la possibilité d'ajouter tout ce que je souhaite autour du graphique (futurs paramètres) mais il y a deux choses que je n'arrive pas à faire:

    1- Enregistrer une photo du graphique (les lignes qui sont normalement faites pour cela dans le code ne m'enregistrent qu'un fond blanc...).

    2- Pouvoir stopper le timer sans tout fermer... pour pouvoir relancer sans "tout" réouvrir.

    ici le code 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    import sys
    from random import randrange
    import matplotlib
    import time
    matplotlib.use("Qt5Agg")
    from PyQt5 import QtCore
    from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt, QTimer)
    from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget
    from numpy import arange, sin, pi
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    from PyQt5.QtWidgets import *
    from matplotlib import pylab
    import matplotlib.pyplot as plt
     
     
    class MyMplCanvas(FigureCanvas):
        """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
        a=2
        b=0
        c=10
        refresh_graph=200
        refresh_graphb=(refresh_graph*-1)-1
        listex=[0,1]
        listey=[randrange(1,c),randrange(1,c)]
        def __init__(self, parent=None, width=2, height=2, dpi=100):
            fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = fig.add_subplot(111)
            self.axes.hold(True)
            super(MyMplCanvas, self).__init__(fig)
            self.setParent(parent)
            FigureCanvas.setSizePolicy(self,QSizePolicy.Expanding,QSizePolicy.Expanding)
            FigureCanvas.setFixedSize(self,800,500)        
            FigureCanvas.updateGeometry(self)
            timer = QTimer(self)
            self.setWindowTitle("title1")
            timer.timeout.connect(self.update_figure)
            self.tstart=time.time()
            timer.start(2)
     
        def update_figure(self):
            pass
     
    class MyStaticMplCanvas(MyMplCanvas):
     
        def update_figure(self):
     
            self.a=self.a+1
            self.b=time.time()-self.tstart
            self.listex.extend([self.a])
            self.listey.extend([randrange(1,self.a)])
            print (time.time())
            if (self.a % self.refresh_graph)==0:
                self.axes.plot(self.listex[self.refresh_graphb:], self.listey[self.refresh_graphb:],color="blue", linewidth=0.5, linestyle="-")
                self.axes.axis([0, self.a, 0, max(self.listey)])
                self.draw()
        def save(self):
            print("ok")
            matplotlib.pylab.savefig('chaussette.png')
            print("ok1")
            plt.savefig('chaussette2.png')
            print("ok2")
            self.main_widget.savefig('chaussette2.png')
            print("ok3")
     
     
     
    class ApplicationWindow(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
            self.setWindowTitle("application main window")
            self.main_widget = QWidget(self)
            l = QVBoxLayout(self.main_widget)
            sc = MyStaticMplCanvas(self.main_widget, width=2, height=2, dpi=100)
            self.bouton=QPushButton("SAVE")
            l.addWidget(sc)
            l.addWidget(self.bouton)
            self.setCentralWidget(self.main_widget)
            self.bouton.clicked.connect(MyStaticMplCanvas.save)
     
        def fileQuit(self):
            self.close()
     
        def closeEvent(self, ce):
            self.fileQuit()
     
        def about(self):
            QMessageBox.about(self, "About",)
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        aw = ApplicationWindow()
        aw.setWindowTitle("PyQt5 Matplot Example")
        aw.show()
        app.exec_()

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il semble que Figure peut le faire, mais il faut que tu en gardes une référence pour ça.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __init__(self, parent=None, width=2, height=2, dpi=100):
            self.fig = Figure(figsize=(width, height), dpi=dpi)
    Et ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        def save(self):
            self.fig.savefig(*args, **kwargs)
    Pour les arguments, voir ici:
    http://matplotlib.org/api/figure_api...Figure.savefig

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    merci beaucoup pour la réponse,
    j'avais en effet déjà essayé de récupérer le graph avec "fig" tel qu'il est déclaré...
    mais cela n'avait pas marché...

    je viens de réessayer en faisant bien attention à ne pas oublier de "self." devant chaque "fig" du code mais cela ne marche apparemment pas... Python bloque à l'enregistrement

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Quel est le message d'erreur et quels paramètres utilises-tu pour savefig ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    en fait je n'ai pas de message d'erreur (aucune ligne en rouge dans l'interpréteur).
    mais j'ai la fenêtre (où il y a mon graphique) qui se ferme dès que la ligne d'enregistrement est atteinte (et puis aucune image n'est enregistrée... En fait le programme s'arrête à cette ligne...

    les paramètres que j'ai utilisé sont les suivant:

    savefig("graphique.png", dpi=None, facecolor='w', edgecolor='w',
    orientation='portrait', papertype=None, format=None,
    transparent=False, bbox_inches=None, pad_inches=0.1,
    frameon=None)

    j'ai quasiment rien modifier par rapport aux données présenté dans la doc afin de ne pas induire moi même d'anomalie.

    j'ai aussi tenté de n'indiquer que "graphique.png" (sans les autres paramètres) en espérant que les autres paramètres soient définis par défaut (au cas ou dans les paramètres indiqués plus haut j'ai des contradictions avec l'état du graphique tel qu'il est au moment de la sauvegarde). Mais là non plus, je n'ai pas d'erreur (commentaires en rouge dans l'interpréteur) mais juste une fermeture de ma fenetre et aucune photo de prise.

    Enfin, j'ai aussi essayé d'indiquer avant le "graphique.png" un chemin (genre: "C:\Users....\graphique.png") mais ça ne va pas non plus...

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Le problème semble ailleurs, la fenêtre n'a aucune raison de fermer.

    Pour fermer une porte, change la connexion du signal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            #self.bouton.clicked.connect(MyStaticMplCanvas.save)
            self.bouton.clicked.connect(sc.save)

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 26/01/2006, 08h44
  2. Graphique avec Turbo Pascal 7
    Par Sagiro dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 21/12/2004, 09h52
  3. [Free Pascal] Graphique avec Dev-Pascal
    Par CompuTux dans le forum Free Pascal
    Réponses: 15
    Dernier message: 03/09/2004, 02h15
  4. Caractéristique des Graphiques avec Tchart
    Par bidson dans le forum XMLRAD
    Réponses: 5
    Dernier message: 19/01/2004, 11h01
  5. faire des graphiques avec Perl
    Par And_the_problem_is dans le forum Modules
    Réponses: 2
    Dernier message: 16/07/2003, 16h08

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