Gráfico interactivo con matplotlib
Estoy tratando de escribir una función que me permite elegir un punto en mi polígono y cambiar sus coordenadas de la siguiente manera:
- elegir un punto p(i)
- asociarlo con las coordenadas del mouse y luego dibujar el cambio
- el segundo clic almacena estas coordenadas en p(i)
import matplotlib as plt
import numpy as np
def mouve(event):
fig=plt.gcf()
ax=plt.gca()
global polycl=[] m = np.array( [event.xdata, event.ydata]) print(m)
global coords
cl.append(m)
ax.clear()
M1=ax.plot(poly[:,0], poly[:,1], ‘-ro’)
plt.xlim([-10, 10])
plt.ylim([-10, 10])
fig.canvas.draw()
plt.show()
global cidd
for i in range(len(poly)):
if dist(m,poly[i])<1: poly[i]=m if (len(cl) > 2 and all(cl[-1,:]==X[-2,:])) :
fig.canvas.mpl_disconnect(cidd)
print(‘done’)
return polydef change(p):
%matplotlib qt
global poly
poly=p
fig=plt.figure()
ax = fig.add_subplot(111)
plt.xlim([-10, 10])
plt.ylim([-10, 10])
ax.plot(poly[:,0], poly[:,1], ‘-bo’)
global cidd
cidd=fig.canvas.mpl_connect(‘buttonpressevent’, mouve)
return poly
davy.ai
Para lograr el resultado deseado de seleccionar y cambiar las coordenadas de un punto en un polígono, puedes usar las funciones proporcionadas
change()
ymouve()
.La función
change()
toma el polígono inicial como entrada y lo muestra en una figura de matplotlib. También conecta unbutton_press_event
a la figura y establece la variable globalcidd
que se usará más adelante para desconectar el evento. Cuando se activa el evento con un clic del ratón, se llama a la funciónmouve()
.La función
mouve()
recibe el objetoevent
y extrae las coordenadas x e y del clic del ratón. Luego itera sobre cada punto del polígono e identifica el punto más cercano al clic del ratón dentro de una distancia especificada (en este caso,dist=1
). El punto del polígono elegido se reemplaza por las nuevas coordenadas del ratón. Cuando se producen dos clics a menos de 1 píxel de distancia entre sí, el evento se desconecta y se devuelve el polígono actualizado.Para usar estas funciones, simplemente llama a
change()
con el polígono deseado como entrada. El polígono actualizado se devolverá después de que se termine el bucle del evento.Nota: El comando
%matplotlib qt
permite realizar gráficas interactivas fuera de un entorno de cuaderno Jupyter.