Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  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 :
    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
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    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 :
    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 :
    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
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    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 :
    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 :
    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 Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 731
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 731
    Points : 2 598
    Points
    2 598

    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 :
    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 Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 731
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 731
    Points : 2 598
    Points
    2 598

    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 :
    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 :
    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
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    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
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •