Xay
Xay

Reputation: 35

Python - Spyder ignoring picker enabled plot

I am writing this script in Spyder (Python 3.5) and I want it to do this: 1) Plot something 2) Allow me to pick some values from the plot 3) Store those values into a variable 4) Do something with that variable

I have checked this thread: Store mouse click event coordinates with matplotlib and modified the function presented there for my own code. The problem I have is that spyder seems to ignore the interactive plot and runs the whole script at once, without waiting for me to pick any values from the plot. As I am using the values for further calculations, I obviously get an error from this. I have even tried to set an input('Press enter to continue...') after the plot, to see if it made it stop and wait for my pickings, but it does not work either. When I run the script step by step, it works fine, I get the plot, pick my values, print the variable and find all of them in there and use them afterwards. So the question is: how can I make it work when I run the whole script?

Here is my code:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import plot as plot

def onpick(event):

    ymouse = event.ydata

    print ('y of mouse: {:.2f}'.format(ymouse))

    times.append(ymouse)

    if len(times)==5:
        f.canvas.mpl_disconnect(cid)

    return times
#

t=np.arange(1000)
y=t**3

f=plt.figure(1)
ax=plt.gca()

ax.plot(t,y,picker=5)

times=[]
cid=f.canvas.mpl_connect('button_press_event',onpick)

plt.show()

#Now do something with times
mtimes=np.mean(times)
print(mtimes)

Upvotes: 1

Views: 931

Answers (1)

Carlos Cordoba
Carlos Cordoba

Reputation: 34156

(Spyder maintainer here) I think to solve this problem you need to go to

Preferences > IPython console > Graphics

and turn off the option called Activate support. That will make your script to block the console when a plot is run, so you can capture the mouse clicks you need on it.

The only problem is you need to run

In [1]: %matplotlib qt5

before starting to run your code because Spyder doesn't that for you anymore.

Upvotes: 3

Related Questions