Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Calcul scientifique
Calcul scientifique Forum d'entraide sur la programmation scientifique et bibliothèques associées (PIL, NumPy, SciPy, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/08/2012, 20h06   #1
benjame
Invité de passage
 
Inscription : 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 !
benjame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2012, 20h54   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 693
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 693
Points : 4 521
Points : 4 521
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/08/2012, 19h21   #3
benjame
Invité de passage
 
Inscription : 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
benjame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2012, 19h56   #4
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 693
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 693
Points : 4 521
Points : 4 521
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/08/2012, 20h08   #5
benjame
Invité de passage
 
Inscription : 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+
benjame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2012, 20h53   #6
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 305
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 305
Points : 1 797
Points : 1 797
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)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/08/2012, 21h28   #7
benjame
Invité de passage
 
Inscription : 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 ?
benjame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2012, 22h45   #8
fred1599
Membre Expert
 
Avatar de fred1599
 
Homme Fred
Enseignant
Inscription : juillet 2006
Messages : 1 305
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 305
Points : 1 797
Points : 1 797
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)
fred1599 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2012, 21h26   #9
benjame
Invité de passage
 
Inscription : juillet 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 7
Points : 0
Points : 0
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+
benjame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 11h14   #10
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 693
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 693
Points : 4 521
Points : 4 521
Salut,

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

- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/09/2012, 23h30   #11
benjame
Invité de passage
 
Inscription : juillet 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2012
Messages : 7
Points : 0
Points : 0
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
benjame est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2012, 13h32   #12
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 693
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 693
Points : 4 521
Points : 4 521
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h00.


 
 
 
 
Partenaires

Hébergement Web