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 :

PySide6 - QLineSeries avec des dates en absisses


Sujet :

PyQt Python

  1. #1
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 314
    Points : 204
    Points
    204
    Par défaut PySide6 - QLineSeries avec des dates en absisses
    Bonjour à tous,

    J'essaie de faire un tableau de bord d'activités en utilisant exclusivement QT6.

    La connexion à la base de données est bonne et je récupère les données sous la forme
    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
     
    Date	andre	paul	marc
    août-19	24	0	0
    sept-19	41	0	0
    oct-19	58	0	0
    nov-19	44	0	0
    déc-19	28	0	0
    janv-20	30	0	0
    févr-20	0	0	30
    mars-20	31	0	0
    avr-20	10	0	0
    mai-20	19	0	0
    juin-20	60	0	0
    juil-20	44	0	0
    août-20	17	0	0
    sept-20	37	0	0
    oct-20	43	0	0
    nov-20	0	29	0
    déc-20	0	0	29
    janv-21	0	65	0
    févr-21	50	0	0
    mars-21	76	0	0
    avr-21	75	0	0
    mai-21	38	0	0
    juin-21	0	76	0
    juil-21	48	0	0
    août-21	22	0	0
    sept-21	24	0	0

    Dans ce cas précis, je voudrais établir un graphe avec les lignes des différentes personnes ressortant des données. J'y arrive, mais j'ai vraiment l'impression que mon code n'est pas propre, en particulier sur la gestion des valeurs de l'axe des ordonnées.
    J'ai utilisé un QBarSeries pour l'occasion, mais cela ne me parait pas très bon. En fait je n'arrive pas a ajouter les dates, au format date, dans au niveau des abscisses comme s'il s'agissait de nombre.
    Il y a trois classes :
    - La première gère la connexion à la BDD
    - La seconde gère, les données issues de la BDD et la création du QChart
    - La troisième gère la mise en page du graphe (QChartView)

    Auriez vous des conseils à me donner pour mettre en place les dates en abscisses.
    JE vous remercie par avance.


    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    import sys
     
    from PySide6 import QtCharts, QtCore
    from PySide6.QtGui import QPixmap, QPainter, Qt
    from PySide6.QtSql import QSqlQuery
    from PySide6.QtWidgets import QApplication, QMainWindow
    from PySide6.QtCharts import QChart, QChartView, QPieSeries, QLineSeries, QBarCategoryAxis, QValueAxis
     
    from uis.ui_main import Ui_MainWindow
     
    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.setupUi(self)
            self.graph_lbl.setScaledContents(True)
            self.conn = Connexion()
            self.req2_btn.clicked.connect(self.nb_chiffre)
            # Date du jour par défaut pour DateEnd
            self.dateEnd.setDate(QtCore.QDate.currentDate())
     
        def nb_chiffre(self):
            query = QSqlQuery(f"""
            SELECT DATE_FORMAT(d.date, '%m/%y') as 'Date', 
                    CASE WHEN dispatch ='andre' THEN count(c.id) else 0 END as "andre", dvi
                    CASE WHEN dispatch ='paul' THEN count(c.id) else 0 END as "paul", dmp
                    CASE WHEN dispatch ='marc' THEN count(c.id) else 0 END as "marc" coprod
            FROM consumes c 
            RIGHT JOIN datas d on c.datas_id = d.id 
            WHERE d.date between  '{self.dateBegin.date().toString(format=Qt.ISODateWithMs)}' and 
                '{self.dateEnd.date().toString(format=Qt.ISODateWithMs)}' 
            GROUP BY DATE_FORMAT(d.date, '%y/%m')
            """)
     
            rec = query.record()
            print(rec.count())
            self.series_date = []
            self.series_andre = QLineSeries()
            self.series_andre.setName("andre")
            self.series_marc = QLineSeries()
            self.series_marc.setName("marc")
            self.series_paul = QLineSeries()
            self.series_paul.setName("paul")
     
            #Ajout des valeurs dans les series
            i=0
            while query.next():
                self.series_date.append(query.value(rec.indexOf("Date")))
                self.series_andre.append(QtCore.QPointF(i, query.value(1)))
                self.series_paul.append(QtCore.QPointF(i, query.value(2)))
                self.series_marc.append(QtCore.QPointF(i, query.value(3)))
                i+= 1
     
            self.chart = QChart()
            self.chart.setTheme(QChart.ChartThemeDark)
            self.chart.addSeries(self.series_andre)
            self.chart.addSeries(self.series_paul)
            self.chart.addSeries(self.series_marc)
     
            # Valeurs des abscisses 
            self.axis_x = QBarCategoryAxis()
            self.axis_x.append(self.series_date)
            self.axis_x.setLabelsAngle(45)
            self.axis_x.setGridLineVisible(False)
            self.chart.setAxisX(self.axis_x, self.series_andre)
            self.chart.setAxisX(self.axis_x, self.series_paul)
            self.chart.setAxisX(self.axis_x, self.series_marc)
     
            # Valeurs des ordonnées
            self.axis_y = QValueAxis()
            self.chart.setAxisY(self.axis_y, self.series_andre)
            self.chart.setAxisY(self.axis_y, self.series_paul)
            self.chart.setAxisY(self.axis_y, self.series_marc)
            self.chart.legend().setVisible(True)
     
            # Construction de la chartView
            self.graph = Show_graph(self.chart)
            self.graph.show()
     
     
    class Show_graph(QMainWindow):
        def __init__(self, chart):
            super().__init__()
            self.resize(1000, 800)
            self.chart = chart
            self._chart_view = QChartView(self.chart)
            self._chart_view.setRenderHint(QPainter.Antialiasing)
            self._chart_view.resize(1000, 800)
            self.vb =  QVBoxLayout()
            self.saveBtn = QPushButton('Enregistrer')
            self.vb.addWidget(self._chart_view)
            self.vb.addWidget(self.saveBtn)
            self.fram = QFrame()
            self.fram.setLayout(self.vb)
            self.setCentralWidget(self.fram)
     
     
    class Connexion(QWidget):
        def __init__(self):
            super().__init__()
            self.db = self.connexion()
     
        def connexion(self):
            db = QSqlDatabase.addDatabase("QMYSQL")
            db.setHostName("localhost")
            db.setDatabaseName("market")
            db.setUserName("root")
            db.setPassword("")
            if not db.open():
                print(db.lastError().text())
                sys.exit()
            return db
     
     
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ui = MainWindow()
        ui.show()
        sys.exit(app.exec())

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par FadeToBlack Voir le message
    Auriez vous des conseils à me donner pour mettre en place les dates en abscisses.
    QDateTimeAxis...?

  3. #3
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 314
    Points : 204
    Points
    204
    Par défaut
    Bonjour Sve@r,

    Je te remercie de ta réponse. J'avais effectivement vu QDateTimeAxis.

    Mais du coup, j'ai un problème concernant la génération des "series" à partir de la ligne 47, dans la boucle While.
    QLinesSeries, me demande un tuple de float. Que je n'ai pas évidemment. d'où l'incrémentation de ma variable "i", et son intégration dans les "series".

    Je viens de tilter ce matin. Je me demande maintenant quel est le retour des données du champ "Date" issue de ma requête. J'avoue que ma stupidité m'a empêché de voir s'il s'agissait de données "datetime" formatées ou un String.
    J'avoue qu'en voyant des résultats comme "02/21", j'ai directement pensé à du String.

    Si c'est du datetime, il faut que je convertisse mes valeurs de date en seconde avec toSecsSinceEpoch()? Et du coup, je peux les intégrer dans mon QLineSeries ?

    Est-ce que je suis sur la bonne démarche ?

    je te remercie par avance.
    Bon We

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    Je viens de tilter ce matin. Je me demande maintenant quel est le retour des données du champ "Date" issue de ma requête. J'avoue que ma stupidité m'a empêché de voir s'il s'agissait de données "datetime" formatées ou un String.
    J'avoue qu'en voyant des résultats comme "02/21", j'ai directement pensé à du String.
    Toujours afficher type(truc) quand on veut vérifier un truc (c'est un principe chez-moi). Effectivement si "truc" est un objet qui surcharge __str__() tu ne peux pas savoir de quoi il s'agit en regardant juste print(truc) => print(truc, type(truc)).

    Citation Envoyé par FadeToBlack Voir le message
    Si c'est du datetime, il faut que je convertisse mes valeurs de date en seconde avec toSecsSinceEpoch()? Et du coup, je peux les intégrer dans mon QLineSeries ?
    Est-ce que je suis sur la bonne démarche ?
    Alors bon QChart jusqu'à hier je ne connaissais pas. Je l'ai découvert en voyant ton topic (en plus justement un de mes soucis non résolus en ce moment est de trouver une alternative à PyQwt et QChart me plait beaucoup ) donc bon je ne peux pas trop te répondre si ta démarche est bonne. J'ai trouvé cet exemple en tapant "PyQt QLineSeries" dans un moteur de recherche.

    Mais en regardant l'exemple que je t'ai passé hier je vois que eux ils convertissent la date en millisecondes !!! => series->append(momentInTime.toMSecsSinceEpoch(), values[2].toDouble())...

Discussions similaires

  1. [VBA-E] Problème avec des dates !
    Par yaya54 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/03/2006, 13h12
  2. Chart mettre un axe avec des dates
    Par rvzip64 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 07/10/2005, 11h36
  3. [VB.NET] Requete avec des dates dans un DataSet
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2005, 14h30
  4. Requetes avec des dates
    Par PrinceMaster77 dans le forum SQL
    Réponses: 1
    Dernier message: 22/11/2004, 17h46
  5. [Requête] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2004, 11h26

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