# Editing wave with mouse clicking

I just want to know why my function on_pick is not working when I click the mouse + why there is no any output as it should be !!!

``````import numpy as np
import matplotlib.pyplot as plt

# Generate an array of time values with 1000 points and a duration of 1 second
time = np.linspace(0, 1, 1000)

# Generate a sine wave with a frequency of 10 Hz and an amplitude of 1
waveform = np.sin(2 * np.pi * 10 * time)

# Create a figure and set up the plot
fig, ax = plt.subplots()
ax.set_title("Wave")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Amplitude")

def on_pick(event):
#Just want to know if the fun is working properly
print("Hello I'm working")
# Get the x coordinate of the mouse click
x = event.mouseevent.xdata

# Remove the data at the x coordinate
waveform[int(x * len(time))] = 0

# Update the plot with the modified waveform data
ax.clear()
ax.plot(time, waveform)

# Enable the pick_event feature
fig.canvas.mpl_connect('pick_event', on_pick)

# Plot the initial waveform data
ax.plot(time, waveform)

# Show the plot
plt.show()

``````

It appears that the `picker` argument is required in the `plot` call to specify a tolerance for the pick.

I changed your code to include that

``````ax.plot(time, waveform, picker=5)
``````

and get into the event handler when I pick on or very near the curve. I suspect if you set it to something huge, you can pick anywhere.

1 Like

I came up with another whole code to solve this issue but the idea here I want the modification to occur on the same plot, not a new figure!!

``````import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backend_bases import MouseButton
# Generate a sine wave with a frequency of 1 Hz and a duration of 5 seconds
t = np.linspace(0, 5, 500)
y = np.sin(2*np.pi*t)
plt.plot(t, y)

# Capture mouse clicks on the plot

points = plt.ginput(4)

# Get the x-coordinates of the mouse clicks
x1, y1 = points
x2, y2 = points
x3, y3 = points
x4, y4 = points

# Find the indices of the waveform signal that correspond to the x-coordinates
i1 = np.argmin(np.abs(t - x1))
i2 = np.argmin(np.abs(t - x2))
i3 = np.argmin(np.abs(t - x3))
i4 = np.argmin(np.abs(t - x4))
# Set the values of the waveform between the two mouse clicks to zero
y[i1:i4+1] = 0
plt.subplots()
plt.plot(t, y)
# Plot the modified waveform

plt.show()
``````