p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité de passage
    Inscrit en
    juillet 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : juillet 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut Get mouse coord X,Y from figure by click.event

    Bonjour à tous !

    Voilà je suis un peu novice en Python et j'espère que certains ici pourront m'éclaircir. Je travail en python pour la programmation scientifique et j'aimerais obtenir les coordonnées d'un point sur une figure lors de l’événement click gauche de ma souris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(np.random.rand(10))
     
    def onclick(event):
    coordx= event.x
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    Le print affiche les coordonnées correctement cependant, j'aimerais récupérer xdata et ydata dans des variables pour les utiliser à nouveau par la suite dans mon programme.
    Quelqu'un a t'il une idée ? Merci d'avance de votre aide !

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 598
    Points : 10 165
    Points
    10 165

    Par défaut

    Citation Envoyé par benjame Voir le message
    Le print affiche les coordonnées correctement cependant, j'aimerais récupérer xdata et ydata dans des variables pour les utiliser à nouveau par la suite dans mon programme.
    Quelqu'un a t'il une idée ? Merci d'avance de votre aide !
    Comme vous débutez, le plus simple sera de passer par des variables "globales":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    xdata = ydata = None
    def onclick(event):
        global xdata, ydata
        xdata, ydata = event.xdata, event.ydata
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    Plus tard, vous lirez pleins de messages vous alertant sur les dangers d'une telle approche. Mais vous aurez appris d'ici là à les utiliser avec modération.
    - W
    Architectures Post-Modernes

  3. #3
    Invité de passage
    Inscrit en
    juillet 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : juillet 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut Module à charger ?

    Citation Envoyé par wiztricks Voir le message
    Comme vous débutez, le plus simple sera de passer par des variables "globales":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    xdata = ydata = None
    def onclick(event):
        global xdata, ydata
        xdata, ydata = event.xdata, event.ydata
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    Plus tard, vous lirez pleins de messages vous alertant sur les dangers d'une telle approche. Mais vous aurez appris d'ici là à les utiliser avec modération.
    - W

    Bonjour,

    Merci pour votre réponse !

    Ca a bien fonctionné dans un premier temps, mais à présent je n'arrive plus à lire mes variables xdata et ydata...

    Peut être que c'est lié à un changement dans mon code, il y a t'il des modules à charger obligatoirement pour cela ?

    Est ce possible d'afficher en direct le résultat avec un print ? je pense notamment à une ligne : print xdata, ydata ?

    Merci

    A bientôt

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 598
    Points : 10 165
    Points
    10 165

    Par défaut

    Salut,

    Citation Envoyé par benjame Voir le message
    Est ce possible d'afficher en direct le résultat avec un print ? je pense notamment à une ligne : print xdata, ydata ?
    vous aviez déjà des "print" dans votre code original, non?
    essayez:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def onclick(event):
        global xdata, ydata
        xdata, ydata = event.xdata, event.ydata
        print 'xdata=%f, ydata=%f' % (xdata, ydata)
    - W
    Architectures Post-Modernes

  5. #5
    Invité de passage
    Inscrit en
    juillet 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : juillet 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut suite ..

    Bah oui mais cela ne marchais pas encore ...Et la impossible de le refaire fonctionner correctement.
    Quand je fais tourner le code suivant, je ne récupère pas l'information contenue dans xdata et ydata... j'y suis pourtant arriver à un moment donc ça doit marcher !!!

    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
     
    from matplotlib import pyplot as plt
     
    plt.figure()
    x=np.arange(0,20)
    y=sin(x)
    plt.plot(x,y)
     
    xdata = ydata = None
    def onclick(event):
        global xdata, ydata
        xdata, ydata = event.xdata, event.ydata
        print 'xdata=%f, ydata=%f' % (xdata, ydata)
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    Lorsque je tape ensuite xdata rien n'apparait ... et type xdata : none type (normal car initialisé)

    Encore merci de ton aide ! On ne doit pas en être très loin !
    A+

  6. #6
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 937
    Points : 2 980
    Points
    2 980

    Par défaut

    En fait il vous manque énormément de choses, en plus des imports manquants

    • numpy n'est pas importé
    • Il n'y a pas d'attribut canvas pour une "Figure"
    • np.sin(x) à la place de sin(x)
    • ...


    Bref veuillez revoir la documentation,
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Invité de passage
    Inscrit en
    juillet 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : juillet 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut suite...

    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
     
    from matplotlib import pyplot as plt
    import numpy as np
     
    plt.figure()
    x=np.arange(0,20)
    y=np.sin(x)
    plt.plot(x,y)
     
    xdata = ydata = None
    def onclick(event):
        global xdata, ydata
        xdata, ydata = event.xdata, event.ydata
        print 'xdata=%f, ydata=%f' % (xdata, ydata)
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
    J'ai fais les modifs comme tu m'as indiqué... Je ne comprends pas ce que tu veux dire par il n'y pas d'attribut canvas pour une figure (j'avoue que je ne vois pas bien l'utilité de la dernière ligne)

    Il y t'il d'autres modifs à faire pour que je puisse stocker mon événement dans mes variables xdata et ydata ?

  8. #8
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 937
    Points : 2 980
    Points
    2 980

    Par défaut

    Ok j'ai pigé, vous avez été voir cette doc, je comprend mieux

    C'est vrai que la doc n'est pas très claire, j'admet, testez ce code, ça doit être fonctionnel

    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
    from matplotlib import pyplot as plt
    from pylab import show
    import numpy as np
     
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(np.random.rand(10))
     
    def onclick(event):
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
     
    show()
    En fait il vous manquait les imports, et surtout la fonction la plus importante, la fonction show() pour voir la figure.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Invité de passage
    Inscrit en
    juillet 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : juillet 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    En effet cela fonctionne les différentes variables s'affichent correctement sur le terminal, mais cependant j'aimerais les stocker pour les utiliser par la suite.

    Par exemple tracé par dessus une ligne verticale définie par l’abscisse xdata. Je l'ai ai initialisé mais rien y fait ... une idée ?

    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
     
     
    #!/usr/bin/python
    # Programme tracé de courbe OHZ
     
    from matplotlib import pyplot as plt
    from pylab import show
    import numpy as np
     
    	fig = plt.figure()
    	ax = fig.add_subplot(111)
    	ax.plot(np.random.rand(10))
     
    xdata = ydata = None
    def onclick(event):
    	global xdata, ydata
        	print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)
     
    cid = fig.canvas.mpl_connect('button_press_event', onclick)
     
    plt.axvline(xdata,'r') 
     
    show()
    A nouveau merci !
    A+

  10. #10
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 598
    Points : 10 165
    Points
    10 165

    Par défaut

    Salut,

    A quel endroit modifiez vous la valeur de xdata, ydata?

    - W
    Architectures Post-Modernes

  11. #11
    Invité de passage
    Inscrit en
    juillet 2012
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : juillet 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Salut !

    Bonne question, très bonne question ...

    Je pensais qu'il s'agissait d'une fonction prédéfinie pour laquelle lorsque l'événement à lieu (ici click souris) la variable est modifiée et stocker. Finalement je ne comprends pas bien tous les rouages de ce code, donc je ne serai de répondre.

    Si tu as une idée ou une explication je prends ! :p

    Merci A +

    Benjamin

  12. #12
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 598
    Points : 10 165
    Points
    10 165

    Par défaut

    Salut,

    Citation Envoyé par benjame Voir le message
    Je pensais qu'il s'agissait d'une fonction prédéfinie pour laquelle lorsque l'événement à lieu (ici click souris) la variable est modifiée et stocker. Finalement je ne comprends pas bien tous les rouages de ce code, donc je ne serai de répondre.
    Je ne comprends pas trop ce que vous me dites.
    xdata et ydata peuvent être récupérés dans l'event passé par le handler "onclick". A vous de voir ce que vous voulez en faire.
    Je vous ai proposé de les stocker des variables globales, mais vous pouvez appeler une fonction "globale" ou la méthode d'un objet avec xdata et ydata
    en paramètres. plt.axvline pourrait être cette "fonction".
    - W
    Architectures Post-Modernes

Discussions similaires

  1. Checkbox mouse click event distinctement de treenode m. cl. ev.
    Par Chavadam dans le forum Windows Forms
    Réponses: 0
    Dernier message: 13/08/2010, 16h00
  2. [ImageIO.read] Can't get input stream from URL!
    Par el_mosquito dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 12/09/2007, 14h55
  3. Get text from application window or other
    Par Ludo_360 dans le forum Delphi
    Réponses: 3
    Dernier message: 24/05/2007, 09h47
  4. get selected index from a select
    Par othmanbenhalima dans le forum Langage
    Réponses: 1
    Dernier message: 01/12/2006, 14h20
  5. Réponses: 2
    Dernier message: 02/12/2005, 17h22

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