Matlab 在Python中运行脚本时如何操作图形? 介绍
在我出生的时候,我习惯了一个交互式界面,在这个界面上,脚本可以在运行时更新图形。在处理过程中,每个图形都可以重新调整大小甚至闭合。这可能意味着每个图形都在其自己的线程中运行,这显然与实际情况不同 IPython可以使用magic命令Matlab 在Python中运行脚本时如何操作图形? 介绍,matlab,matplotlib,python,Matlab,Matplotlib,Python,在我出生的时候,我习惯了一个交互式界面,在这个界面上,脚本可以在运行时更新图形。在处理过程中,每个图形都可以重新调整大小甚至闭合。这可能意味着每个图形都在其自己的线程中运行,这显然与实际情况不同 IPython可以使用magic命令%pylab或%matplotlib来模拟Matlab行为,这是我的问题所在 然后,我的目标是允许独立的Python脚本像Matlab一样工作(或者像IPython和%matplotlib一样工作)。换句话说,我希望这个脚本从命令行执行。我期待着每3秒钟就会出现一个新
%pylab
或%matplotlib
来模拟Matlab行为,这是我的问题所在
然后,我的目标是允许独立的Python脚本像Matlab一样工作(或者像IPython和%matplotlib
一样工作)。换句话说,我希望这个脚本从命令行执行。我期待着每3秒钟就会出现一个新的数字。在执行过程中,我将能够缩放,调整大小,甚至关闭的数字
#!/usr/bin/python
import matplotlib.pyplot as plt
import time
def do_some_work():
time.sleep(3)
for i in range(10):
plt.plot([1,2,3,4])
plt.show() # this is way too boilerplate, I'd like to avoid it too.
do_some_work()
当脚本在Python(而不是IPython)中运行时,除了%matplotlib
之外,我还可以使用什么方法来操作图形
我已经研究过哪些解决方案?
我目前找到了三种方法来制作情节剧
1<代码>%pylab/%matplotlib
>>> from pylab import *
>>> plot([1,2,3,4])
如上所述,应避免使用%pylab
,以防止名称空间受到污染
>>> %pylab
>>> plot([1,2,3,4])
这个解决方案很好,绘图是非阻塞的,不需要额外的show()
,之后我仍然可以使用grid()
添加网格,并且我可以关闭、调整或缩放我的图形,而无需其他问题
不幸的是,%matplotlib
命令仅在IPython上可用
2<代码>来自pylab导入*或来自matplotlib.pyplot导入plt
>>> from pylab import *
>>> plot([1,2,3,4])
这里的情况大不相同。我需要添加命令show()。我只能关闭图形以执行下一个命令,例如grid()
,由于图形现在已关闭,因此该命令将无效
**三,<代码>从pylab导入*
或从matplotlib.pyplot导入plt
+ion()
**
一些建议建议使用ion()
命令,如下所示:
>>> from pylab import *
>>> ion()
>>> plot([1,2,3,4])
>>> draw()
>>> pause(0.0001)
不幸的是,即使绘图显示,我也无法手动关闭图形。我需要在终端上执行close()
,这不是很方便。此外,还需要两个附加命令,例如draw();暂停(0.0001)
不是我所期望的
总结
有了%pylab
,一切都很棒,但我不能在IPython之外使用它
通过pylab import*中的和绘图
,我得到了一个阻塞行为,IPython的所有功能都被浪费了
pylab import*
后接ion
提供了一个很好的替代方案,但我必须使用奇怪的pause(0.0001)
命令,该命令会导致无法手动关闭的窗口(我知道一些后端不需要使用暂停
。我使用的是WxAgg
,这是唯一一款在Cygwin x64
上运行良好的
这建议使用
matplotlib.interactive(True)
。不幸的是,它不起作用,并且给出了与ion()
相同的行为。将您的do\u some\u work
函数更改为以下值,它应该可以工作
def do_some_work():
plt.pause(3)
对于交互式后端plt。暂停(3)
启动事件循环3秒钟,以便它可以处理调整大小事件。注意,这是一个实验性功能,对于复杂的动画,您应该使用
%pylab
和%matplotlib
魔术命令也会启动事件循环,这就是用户可以与绘图交互的原因。或者,您可以使用%gui wx
启动事件循环,然后使用%gui
关闭它。您可以使用该函数测试它是否正在运行
使用ion()
或ioff()
的原因在页面中有很好的解释。原则上,用户在没有IPython的情况下可以进行交互。但是,我无法从该页面获得交互示例来使用Qt4Agg
后端,只能使用MacOSX
后端(在我的Mac上)。我没有尝试使用WX
后端
编辑
我确实通过使用PyQt4而不是PySide(因此在我的~/.config/matplotlibrc
文件中设置backend.qt4:PyQt4
)使交互式示例能够与Qt4Agg后端一起工作。我认为该示例不能与所有后端一起工作。我提交了一个问题
编辑2
恐怕我想不出在长时间计算运行时不使用线程来操纵图形的方法。正如您所提到的:Matplotlib不启动线程,IPython也不启动线程。%pylab和%Matplotlib命令在处理read eval print循环中的命令和让GUI处理事件之间交替使用很短的时间。他们按顺序做
事实上,即使使用%matplotlib或%pylab魔术,我也无法再现您的行为。(需要明确的是:在ipython
中,我首先调用%matplotlib
,然后%run yourscript.py
)。%matplotlib魔术将matplotlib置于交互模式,这使得plt.show()
调用非阻塞,以便立即执行do\u some\u work
功能。但是,在时间内。sleep(3)
调用时,数字没有响应(如果我增加睡眠时间,这一点会变得更加明显)。我不明白这在你这方面如何起作用
除非我错了,否则您必须将计算分解成更小的部分,并使用
plt.pause
(或者更好的是,使用动画模块)来更新图形。我的建议是继续使用IPython,因为它管理GUI事件循环f