通过Eclipse PyDev的交互式matplotlib



这是对这个交互式matplolib通过eclipse线程的后续操作,它已经有2年的历史了,我想知道在此期间是否有任何进展。

我在Eclipse PyDev的控制台窗口中运行IPython控制台,但我无法使用matplotlib获得相同的交互式绘图功能,就像我在Eclipse PyDev外部的(Windows)命令提示符下运行IPython一样。以下是两者的比较:

A)在Eclipse PyDev外部的shell中运行IPython

  1. 在Windows命令提示符下使用"IPython--pylab"运行IPython
  2. 在IPython控制台中输入"plot([1,2,3])"。这将打开一个图形绘制窗口,IPython控制台已准备好接受进一步的命令(无需关闭图形绘制窗口)
  3. 例如,我可以输入"xlabel('years')",这将更新我的图形绘图窗口

B)在Eclipse PyDev的交互式控制台中运行IPython在Eclipse PyDev的IPython交互式控制台中输入以下内容:

  1. "从pylab导入*">
  2. "plot([1,2,3])"-->图形绘图窗口不显示
  3. 我必须输入"show()"才能打开图形绘图窗口。但现在的问题是,只要我保持图形绘图窗口打开,IPython控制台就不会接受任何新命令
  4. 因此,我关闭图形绘图窗口,输入"xlabel('years')",然后再次输入"show()"。这将重新打开以"年"为轴标签的图形绘图窗口,但绘图本身为空,不再显示[1,2,3]数据

有了这种行为,A)显然优于B),但我想继续在Eclipse PyDev中工作,因为我喜欢总是在屏幕上显示变量列表(而不必像在windows shell中运行IPython那样运行命令来显示所有变量)。正如另一个线程中所建议的那样,使用Wicked Shell是不起作用的(IPython在Wicked Shell中不能正常工作)。

如何在Eclipse PyDev中配置IPython,使其显示与在windows命令提示符下运行相同的交互行为?

您可以通过在PyDev首选项中为交互式控制台选择GUI来解决此问题。

Eclipse->窗口->首选项->Pydev->交互控制台->启用GUI事件循环集成。

在我的案例中,我选择了PyQt(qt/qt4)

对可能不完整的答案表示歉意,但希望我能澄清这个问题。

我相信OP所描述的是正常行为。事实上,从命令行ipython开始,导入pylab并发出plot命令会产生所描述的阻塞行为,因此这与pydev或eclipse无关。事实上,matplotlib中的show在交互模式下被阻塞;当您在以"ipython-pylab"启动的ipython会话中使用matplotlib时,您正在利用ipython开发人员围绕matplotllib为您所做的一些"技巧",允许同时进行交互模式和非阻塞调用。然而,进口pylab还不足以应用这些"黑客"。PyDev似乎不允许对解释器调用使用标志,因此不能直接调用"ipython-pylab"。

幸运的是,ipython有一个特殊的命令"pylab",即使解释器不是用pylab标志启动的,它也会应用黑客并导入pylab。因此,您可以尝试在控制台中键入"pylab"(实际上,您甚至可以自定义pydev控制台,使其自动完成),您应该会得到所需的行为。然而,我必须报告的是,虽然从命令行启动的ipython会话对我来说很好,但当我尝试从Eclipse内部执行同样的操作时,会出现问题。命令没有阻止,我得到了python图标,但matplotlib窗口没有显示。记录在案,我在Mac上运行雪豹。我无法判断是否同样的问题也发生在OP似乎正在使用的Windows中。

我在Eclipse PyDev中通过在另一个线程中执行绘图函数来实现类似的行为:

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")

使用工具链Eclipse 4.3、PyDev 2.7.1、Python 3.2、IPython 0.13 进行测试

只需使用%matplotlib魔术命令即可激活交互式绘图(正是您所描述的)。

pylab命令导入numpy.*pylab.*,严重污染全局命名空间。

最新更新