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 :

matplotlib hover event


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut matplotlib hover event
    Bonjour,
    je cherche à permettre des hover event sur un graph matplotlib.
    j'ai trouvé une solution ci dessous qui marche bien:

    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
    import matplotlib.pyplot as plt
    import numpy as np; np.random.seed(1)
     
    x = np.random.rand(15)
    y = np.random.rand(15)
     
     
    fig, ax = plt.subplots()
    sc = plt.scatter(x, y, s = 200)
     
    def hover(event):
        if event.inaxes == ax:
            cont, ind = sc.contains(event)
            if cont:
                print("OK")
            else:
                print("KO")
     
    fig.canvas.mpl_connect("motion_notify_event", hover)
     
    plt.show()
    dans l'exemple ci dessus "event" et "ax" correspondent respectivement à :
    motion_notify_event: xy=(1, 244) xydata=(None, None) button=None dblclick=False inaxes=None
    AxesSubplot(0.125,0.11;0.775x0.77)

    Lorsque j'essaie d'appliquer cette méthode en embarquant le graphique dans un Widget, je n'arrive pas à faire passer (ou récupérer) certains paramètres... et ça me bloque... j'arrive pas à trouver un moyen d'embarquer la solution ci dessus! dans l'exemple ci dessous, "figure_7" et "graphique_7" appartiennent à une classe QWidget donc la méthode hover appartient elle aussi à cette même classe:

    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
    from matplotlib.backends.backend_qt5agg import (FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    from matplotlib.figure import Figure
     
    figure_7 = FigureCanvas(Figure())
    graphique_7 = figure_7.figure.subplots(nrows=1, ncols=1)
     
    try:
           graphique_7.scatter([1,2,3,4,5,6,7,8,9], [5,4,7,8,9,3,2,1,6])
           figure_7.figure.canvas.mpl_connect("motion_notify_event", self.hover)
    except:
           print("hover failed")
     
     
    def hover(arg1, arg2):
            print(arg1)
            print(arg2)
            try:
                #????
            except:
                print("ko")
    Dans cet exemple, l'appel du mpl_connect ne semble pas accepter de paramètre lié à la méthode hover. ça m'arrangerait de pouvoir faire passer mon graphique_7! mais même quand je bascule dans ma classe avec "self.graphqiue_7" dans mon __init__ et dans ma methode... ça marche pas...
    Contrairement au premier exemple du message je n'ai pas 1 paramètre "event" de récupéré dans ma méthode mais deux (dont le event qui correcpond à arg2)... j'ai essayé de vérifier les types de chacun de mes objets pour ne pas me tromper d'appel mais je n'arrive pas à communiquer "normalement" avec la méthode appelé via le mpl_connect.

    des idées?
    merci

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut
    Je crois que je viens de trouver la réponse à ma question...
    Les deux arguments que renvoi le connect du matolotlib ne sont rien d'autre que le self de ma classe et le event lui meme... Du coup je vois bien comment tout relier...

    Bon j'essaie ca des que je peux, mais je pense que c'est ca!

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut
    Bonjour,
    ci dessous finalement la réponse à ma question initiale... (je me suis bêtement mélangé les pinceaux en fin de semaine dernière).

    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
    from PyQt5.QtWidgets import QWidget, QDesktopWidget, QVBoxLayout, QMainWindow, QApplication
    from matplotlib.backends.backend_qt5agg import (FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    from matplotlib.figure import Figure
    import sys
     
    class Fenetre_Principale_indicateurs(QMainWindow):        
        def __init__(self):
            QMainWindow.__init__(self)
     
            try:
                figure_1 = FigureCanvas(Figure())  
                graphique_1 = figure_1.figure.subplots(nrows=1, ncols=1)
                self.graphique_dynamique = graphique_1.scatter([1,2,3,4,5,6,7,8,9], [5,4,7,8,9,3,2,1,6])
            except:
                print("Création objet Graphique KO")
     
     
            try:
                graphique_1.set_title("Titre")
                graphique_1.set_ylim(-50, 50)
                graphique_1.set_xlim(0, 10)
            except:
                print("Personnalisation Graphique KO")
     
     
            try:   
                figure_1.figure.canvas.mpl_connect("motion_notify_event", self.hover)
            except:
                print("Connect pour Hover KO")
     
     
            try:
                self.fenetre_widget = QWidget()
                layout_vertical_global1 = QVBoxLayout()
                layout_vertical_global1.addWidget(figure_1)
                self.fenetre_widget.setLayout(layout_vertical_global1)      
                self.setCentralWidget(self.fenetre_widget)
            except:
                print("Intégration KO")
     
        def hover(self, event):
            try:
                if event.inaxes:
                    cont, ind = self.graphique_dynamique.contains(event)
                    if cont:
                        print("OK")
            except:
                print("Dynamic Hover failed")
     
    def main(args):
        appli=QApplication(args)
        fenetre=Fenetre_Principale_indicateurs()
        fenetre.show()
        r=appli.exec_()
        return r
     
    if __name__=="__main__":
        main(sys.argv)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/04/2019, 09h40
  2. [QGraphicsItem] Propagation Hover Events
    Par Gulish dans le forum Qt
    Réponses: 10
    Dernier message: 22/07/2009, 15h19
  3. Gérer les events d'un tableau de boutons
    Par lord_kalipsy dans le forum wxWidgets
    Réponses: 7
    Dernier message: 20/10/2004, 10h13
  4. Réponses: 4
    Dernier message: 21/05/2004, 09h13
  5. Accès à une case d'un DBGrid dans l'event OnKeyDown
    Par fba dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/03/2004, 12h48

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