6

This is a follow up to this interactive matplolib through eclipse thread which is about 2 years old, I was wondering if there has been any progress in the meantime.

I am running the IPython console in a console window in Eclipse PyDev, but I am unable to get the same interactive plotting features with matplotlib as if I were to run IPython in a (Windows) command prompt outside Eclipse PyDev. Here is how the two compare:

A) Running IPython in a shell outside Eclipse PyDev

  1. Run IPython in a Windows command prompt with "ipython --pylab"
  2. Within the IPython console enter "plot([1,2,3])". This will open a figure plot window and the IPython console is ready for further commands (without having to close the figure plot window).
  3. For example, I can enter "xlabel('years')" and this will update my figure plot window.

B) Running IPython in an interactive console within Eclipse PyDev Enter the following in the IPython interactive console within Eclipse PyDev:

  1. "from pylab import *"
  2. "plot([1,2,3])" --> Figure plot window does not show up.
  3. I have to enter "show()" to open the figure plot window. But now the problem is that as long as I keep the figure plot window open, the IPython console does not accept any new commands.
  4. So I close the figure plot window, enter "xlabel('years')", followed by "show()" again. This will re-open the figure plot window with "years" as my axis label, but the plot itself is empty and does not show the [1,2,3] data anymore.

With this behaviour, A) is clearly superior to B), but I would like to keep working in Eclipse PyDev because I like always having the variables list on my screen (without having to run a command to show all variables like when running IPython form a windows shell). Using Wicked Shell, as suggested in the other thread, does not work (IPython does not work properly in Wicked Shell).

How can I configure IPython in Eclipse PyDev so that it shows the same interactive behavior as if I would run it in a windows command prompt?

Community
  • 1
  • 1
Michael
  • 407
  • 2
  • 6
  • 11
  • Try calling `ion()` - it's a function from matplotlib that means 'interactive mode on'. – Thomas K Nov 19 '12 at 18:19
  • Thank you Thomas. I fear ion() does not resolve it. At least on my Windows PC ion() results in figures which are not responding and have to be terminated using the Task Manager. – Michael Nov 20 '12 at 23:07

4 Answers4

9

You can solve this problem by selecting a GUI for the Interactive Console in PyDev Preference.

Eclipse -> Window -> Preferences -> Pydev -> Interactive Console -> Enable GUI event loop integration.

In my case, I chose PyQt (qt/qt4)

Andy
  • 91
  • 1
  • 1
4

Apologies for the potentially incomplete answer, but hopefully I will be able to shed some light on the problem.

I believe that the one that the OP describes is normal behaviour. In fact, starting from the command line ipython, importing pylab and issuing a plot command produces exactly the blocking behaviour described, so this is not related to pydev or eclipse. The fact is that show in matplotlib is blocking in interactive mode; when you use matplotlib in a ipython session started as "ipython --pylab", you are taking advantage of some "hacks" that the ipython developers did for you around matplotlib, allowing to have both an interactive mode and non blocking calls. However, importing pylab is not enough to apply these "hacks". PyDev does not seems to allow flags to the interpreter call, so one can't directly invoke "ipython --pylab".

Luckily, ipython has a special command "pylab" that applies the hacks and imports pylab even if the interpreter was not started with the pylab flag. So you can just try to type "pylab" inside the console (actually, you can even customize your pydev console so that it is done automatically) and you should get the desired behaviour. However, I must report that while this works fine for me from a ipython session started from the command line, something goes wrong when I try to do the same from inside Eclipse. The command doesn't block, I get the python icon but the matplotlib window doesn't show up. For the records, I am on a Mac running Snow Leopard. I am not able to tell if the same problem happens also in Windows, that the OP seems to be using.

Spock
  • 1,336
  • 1
  • 9
  • 9
  • 1
    Update: under Eclipse 4.4 under Ubuntu 14.04 64bit typing `pylab` makes fully interactive and non-blocking plots as expected. – Adam Ryczkowski Aug 12 '14 at 12:38
0

I achieve similar behave in Eclipse PyDev by executing plotting function in another thread:

import threading
from pylab import *
import matplotlib.animation as animation
import time

x = array(range(0,1000))/100
y = sin(x)

def updateData(self):
    ax.set_data(x,y)

def MyThread():
    global ax
    fig, axarr = subplots(1)
    ax, = axarr.plot(x,y)
    simulation = animation.FuncAnimation(fig, updateData)
    show()


t = threading.Thread(target=MyThread)
t.start()

# console stay active, user can interactively control figure
time.sleep(1)
y = sin(2*x)
time.sleep(2)
ax.get_axes().grid()
ax.get_axes().set_xlabel("time")

Tested with toolchain Eclipse 4.3, PyDev 2.7.1, Python 3.2, IPython 0.13

Liteon
  • 1
  • 1
    Sadly, this does not work for me. I get _ValueError: signal only works in main thread_ – Zah Mar 29 '13 at 15:26
  • For some reason the line `import matplotlib.animation as animation` does kill my IPython3 interpreter under Ubuntu 14.04 64bit Eclipse – Adam Ryczkowski Aug 12 '14 at 12:35
0

Just use the %matplotlibmagic-command to activate interactive plotting (exactly what you described).

The pylab command imports numpy.* and pylab.*, seriously polluting your global namespace.

ankostis
  • 8,579
  • 3
  • 47
  • 61