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

Bibliothèques tierces Python Discussion :

PySimpleGUI + Matplotlib : Graphiques ne s'affichant pas / plus ?


Sujet :

Bibliothèques tierces Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur Energies
    Inscrit en
    Août 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur Energies
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2022
    Messages : 3
    Points : 4
    Points
    4
    Par défaut PySimpleGUI + Matplotlib : Graphiques ne s'affichant pas / plus ?
    Bonjour,

    Débutant en Python depuis quelques jours et surtout à tout ce qui a attrait au 'Front End'.

    J'ai essayé de faire un petit quelque chose de ce côté là en utilisant PySimpleGUI (qui est nouveau pour moi) ainsi que Matplotlib.
    L'objectif du programme pour le moment est d'afficher différents graphiques liés à 2 objets (Bassin, Pluie) mais je rencontre un soucis dans l'affichage des graphiques.


    Ca fait un petit moment que j'essaye de corriger le soucis sauf que je ne vois pas où il se trouve. Il n'y a pas d'erreur retournée.
    Les deux premiers graphiques (1,1 & 1,2) fonctionnaient à un moment (les 2 autres ne sont pas paramétrés pour l'instant) mais ne fonctionnent plus maintenant.
    Par rapport au moment où ça a fonctionné, j'ai bougé des blocs de code...

    In-fine, j'aimerais que les objets Bassin & Pluie et plus particulièrement puisse s'initialiser avec le nom de qui est rentré dans le premier champ d'input du programme.
    J'ai quelques doutes que ça fonctionne avec cet ordre de code là (même si ça a fonctionné à un moment...).

    Si une bonne âme peut y jeter un oeil avec son oeil avisé ?

    Merci par avance

    Les deux fichiers de données Excel sont ci-dessous :
    Hauteur_eau_D1.xlsx
    Pluviométrie.xlsx

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
     
    # Imports tools
     
    from datetime import datetime
    import pandas as pd
    import numpy as np
    from matplotlib import pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
     
    import PySimpleGUI as sg
     
    # Import specific classes
    #.........
     
     
    # Classe Bassin
    class Bassin:
        def __init__(self, nom, h_eau, z_fond, z_top, s_fond, s_top):
            self.nom = nom          #string
            self.h_eau = h_eau      # array
            self.z_fond = z_fond    # float
            self.z_top = z_top      # float
            self.s_fond = s_fond    # float
            self.s_top = s_top      # float
     
        # def __call__(self):
        #    print (f'Bassin {self.nom} a été créé avec la géométrie : \n Alti fond : {self.z_fond} \n Alti top : {self.z_top} \n Surface fond : {self.s_fond} \n Surface top : {self.s_top} ')
     
     
        # Methods
        def calc_vol_inst(self, date_inst):
            volume_instant = 1/3*(self.h_eau[date_inst]*(self.s_top+self.s_fond+pow(self.s_top*self.s_fond,0.5)))      # En attendant une loi de remplissage spécifique
            #print('Volume instantané présent dans bassin le {} : {:.1f} m3'.format(date_inst, volume_instant[date_inst]))
            return volume_instant
     
        def calc_vol_jour(self, date_jour):
            volume_instant = 1/3*(self.h_eau[date_jour]*(self.s_top+self.s_fond+pow(self.s_top*self.s_fond,0.5)))      # En attendant une loi de remplissage spécifique
            diff_volume = np.ediff1d(volume_instant)
            A=[0]
            diff_volume_resized = np.insert(diff_volume, 0, A)
            gain_volume_individual = (diff_volume_resized > 0)*diff_volume_resized
            #print('Volume gagné par le bassin le {} : {:.1f} m3'.format(date_jour, gain_volume_period))
            return gain_volume_individual
     
        def calc_vol_jour_sum(self, date_jour):
            volume_instant = 1/3*(self.h_eau[date_jour]*(self.s_top+self.s_fond+pow(self.s_top*self.s_fond,0.5)))      # En attendant une loi de remplissage spécifique
            diff_volume = np.ediff1d(volume_instant)
            A=[0]
            diff_volume_resized = np.insert(diff_volume, 0, A)
            gain_volume_individual = (diff_volume_resized > 0)*diff_volume_resized
            gain_volume_period = gain_volume_individual.sum()
            #print('Volume gagné par le bassin le {} : {:.1f} m3'.format(date_jour, gain_volume_period))
            return gain_volume_period
     
        def calc_vol_ajutage(self, date_jour, h_eau_min):
            h_eau_filtered = (self.h_eau[date_jour] > h_eau_min)*self.h_eau[date_jour];
            volume_ajutage_instant = (0.8*0.025*0.025*3.14*pow(2*9.81*h_eau_filtered[date_jour],0.5)*3600)
            # print('Volume ajuté par le bassin le {} : {:.1f} m3'.format(date_jour, volume_ajutage_instant))
            return volume_ajutage_instant
     
        def calc_vol_ajutage_sum(self, date_jour, h_eau_min):
            h_eau_filtered = (self.h_eau[date_jour] > h_eau_min)*self.h_eau[date_jour];
            volume_ajutage_instant = (0.8*0.025*0.025*3.14*pow(2*9.81*h_eau_filtered[date_jour],0.5)*3600).sum()
            print('Volume ajuté par le bassin le {} : {:.1f} m3'.format(date_jour, volume_ajutage_instant))
            return volume_ajutage_instant
     
    # Classe Pluie
    class Pluie:
        def __init__(self, surface, intensite):
            self.surface = surface       #float
            self.intensite = intensite   #array
     
        def calc_volume_pluie_jour(self, date_jour):
            volume_pluie_jour = ((self.intensite[date_jour] * self.surface) / 1000)
            #print('Volume de pluie du {} : {:.1f} m3'.format(date_jour, volume_pluie_jour))
            return volume_pluie_jour   
     
        def calc_volume_pluie_jour_sum(self, date_jour):
            volume_pluie_jour = ((self.intensite[date_jour] * self.surface) / 1000).sum()
            #print('Volume de pluie du {} : {:.1f} m3'.format(date_jour, volume_pluie_jour))
            return volume_pluie_jour   
     
     
     
    # Variables Bassin
    Nom_bassin = 'D1'
    print('Récupération des données du bassin', Nom_bassin,'.........','\n')
    Bassin_Data = pd.read_excel('Hauteur_eau_{}.xlsx'.format(Nom_bassin), index_col = 'Date', parse_dates=True)
     
    Bassin_heau = Bassin_Data["Hauteur d'eau"]
    Bassin_z_fond = 636
    Bassin_z_top = 637.4
    Bassin_s_fond = 228
    Bassin_s_top = 404
     
    # Bassin : Création objet
    bassin1 = Bassin(Nom_bassin, Bassin_heau, Bassin_z_fond, Bassin_z_top, Bassin_s_fond, Bassin_s_top)
     
    # Variables Pluie
    Pluie_Data = pd.read_excel('Pluviométrie.xlsx', index_col = 'Date', parse_dates=True)
    pluie_surface = 6125.0
    pluie_intensite = Pluie_Data["Intensite"]
     
    # Pluie : Création objet
    print('Initialisation des données de pluviométrie pour', Nom_bassin,'.........','\n')
    pluie1 = Pluie(pluie_surface, pluie_intensite)
     
     
    # User interface
     
    def update_figure(date_start, date_fin):   
        axes = fig.axes    
        plt.subplot(2,2,1)
     
        dates = pd.date_range(start=date_start, end=date_fin, freq='H')
     
        val_vol_pluie = pluie1.calc_volume_pluie_jour(dates)
        print(val_vol_pluie)
        axes[0].bar(dates, val_vol_pluie)
        axes[0].grid
        axes[0].set_title('Volume de pluie / Surface référence')
        axes[0].set_ylabel('Volume (m3)')
     
        plt.subplot(2,2,2)
        val_vol_bassin = bassin1.calc_vol_jour(dates)
        axes[1].bar(dates, val_vol_bassin)
        axes[1].grid
        axes[1].set_title('Volume instantané dans bassin par heure')
        axes[1].set_ylabel('Volume (m3)')
     
        figure_canvas_agg.draw()
        figure_canvas_agg.get_tk_widget().pack()
     
    sg.theme('DarkTeal7')
     
    layout = [
            [sg.Input(default_text= 'D1',key = '-BASSIN_NOM-', expand_x=True)],
            [sg.Input(default_text= '2022-06-01', key = '-DATE DEBUT-', expand_x=True)],
            [sg.Input(default_text= '2022-06-02', key = '-DATE FIN-', expand_x=True)],
            [sg.Button('Submit Date')],
            [sg.Text(size=(10,1), justification = 'left', key='-DATE-',text_color = 'black', background_color = 'white')],
            [sg.Button('Draw Volume contenu dans bassin')],
            [sg.Canvas(key = '-CANVAS-')]
    ]
     
    window = sg.Window('Bassin Monitoring', layout, finalize=True)
     
    # Matplotlib
    fig = plt.Figure(figsize = (25,10))
    fig.add_subplot(2,2,1).plot([],[])
    fig.add_subplot(2,2,2).plot([],[])
    fig.add_subplot(2,2,3).plot([],[])
    fig.add_subplot(2,2,4).plot([],[])
     
    figure_canvas_agg = FigureCanvasTkAgg(fig, window['-CANVAS-'].TKCanvas)
    figure_canvas_agg.draw()
    figure_canvas_agg.get_tk_widget().pack()
     
     
    while True:
        event, values = window.read()
        if event == sg.WIN_CLOSED:
            break
     
        if event == 'Submit Date':
            Nom_bassin = values['-BASSIN_NOM-']
            date_start = values['-DATE DEBUT-']
            date_fin = values['-DATE FIN-'] 
            if isinstance((date_start, date_fin), str):
                window['-BASSIN_NOM-'].update(Nom_bassin)
                window['-BASSIN_NOM-'].update('')
                window['-DATE DEBUT-'].update(date_start)
                window['-DATE DEBUT-'].update('')
                window['-DATE FIN-'].update(date_fin)
                window['-DATE FIN-'].update('')
     
            if event == 'Draw Volume contenu dans bassin':
                update_figure(date_start, date_fin)
     
    window.close()

  2. #2
    Candidat au Club
    Homme Profil pro
    Ingénieur Energies
    Inscrit en
    Août 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur Energies
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2022
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Soucis résolu !

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/11/2012, 14h13
  2. Légende Courbe-Expression dans graphique ne s'affiche pas
    Par lyonnaisdu26 dans le forum QlikView
    Réponses: 4
    Dernier message: 22/12/2011, 11h12
  3. [JpGraph] Graphique ne s'affiche pas en ligne mais fonctionne en local
    Par ben.IT dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 31/07/2009, 12h01
  4. Réponses: 5
    Dernier message: 07/11/2008, 17h10
  5. [JTable] n'affiche pas plus de 28 lignes.
    Par petrone dans le forum Composants
    Réponses: 7
    Dernier message: 18/07/2008, 16h59

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