I'm created a vertical and a horizontal line in a plot with mouseover event. Those lines intend to help user to select where to click in the plot.
My problem is that when the mouse moves over the plot, the lines previous drawn don't disappear.
Can someone explain me how to do it?
I used ax.lines.pop() after draw the plot inside the OnOver function but that doesn't worked.
This is the code that I'm using
from matplotlib import pyplot as plt
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)
def OnOver(event):
x = event.xdata
y = event.ydata
ax.axhline(y)
ax.axvline(x)
plt.draw()
did = fig.canvas.mpl_connect('motion_notify_event', OnOver)
#iii = fig.canvas.mpl_disconnect(did) # get rid of the click-handler
cid = fig.canvas.mpl_connect('button_press_event', OnClick)
plt.show()
Thanks in advance for your help. Ivo
Don't show the plot show()” also written as “plt. show()” is the command responsible for showing the plot. If you want the figure to NOT show, then simply skip this step. By this way, the plot is generated, saved and closed.
You need to remove the lines you do not want. For example
def OnOver(event):
if len(ax.lines) > 1 :
ax.lines[-1].remove()
ax.lines[-1].remove()
ax.axhline(event.ydata)
ax.axvline(event.xdata)
plt.draw()
This is neither robust nor efficient.
Instead of constantly creating and destroying lines we can just draw them once and keep updating them.
lhor = ax.axhline (0.5)
lver = ax.axvline (1)
def OnOver2(event):
lhor.set_ydata(event.ydata)
lver.set_xdata(event.xdata)
plt.draw()
Here I have used global variables and drawn the "cross hairs" in the viewing area to begin with. It could instead be drawn outside of it or not made visible, but you get the idea.
I don't know the optimal way for achieving this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With