¿Cómo almacenar las coordenadas en una variable del evento onclick de Matplotlib?
Quiero poder usar las coordenadas del punto en el que hago clic en mi gráfico para utilizarlas más adelante en mi script. He estado intentando con variables globales dentro de la función onclick y eso no funciona. ¿Por qué?
Segunda pregunta: ¿cómo puedo resolver esto?
Aquí está mi código simplificado donde intento almacenar las coordenadas x en la variable x. Después de que se completa el script, la variable x tiene el valor -999, es decir, el valor de inicio. Quiero obtener la coordenada x de mi clic de ratón en el gráfico:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(np.random.rand(10))
x = -999
def onclick(event):
print(event.xdata, event.ydata)
global x
x = event.xdata
print(x)
plt.close()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
davy.ai
Primera pregunta:
La razón por la cual el uso de variables globales dentro de la función
onclick
no funciona, es que cuando se utilizaglobal
, crea una variable en el ámbito global que oculta la variable con el mismo nombre en el ámbito local. Sin embargo, en este caso, la variablex
que se define fuera de la función no está en el ámbito global, sino en el ámbito del módulo. Por lo tanto, cuando se utilizaglobal x
dentro de la funciónonclick
, se crea una nueva variable globalx
que es diferente de la variablex
definida fuera de la función. Como resultado, cuando se establece el valor dex
dentro de la función, no se está cambiando el valor de la variablex
fuera de la función.Segunda pregunta:
Para resolver el problema, puedes declarar la variable
x
como una variable global dentro de la funciónonclick
, agregando la líneaglobal x
al comienzo de la función. Esto le indicará a Python que deseas utilizar la variablex
que está definida fuera de la función. Aquí está el código modificado:Ahora, cuando hagas clic en el gráfico, el valor de
x
se establecerá en la coordenada x del punto en el que hiciste clic. Puedes utilizar este valor más adelante en tu script o en una función a la que llames desde la funciónonclick
.