介绍
因为我来自matlab,我习惯了交互式界面,其中脚本可以在运行时更新图形。在处理过程中,每个图形都可以调整大小甚至关闭。这可能意味着每个图形都在自己的线程中运行,这显然不是这样的绘图库.
IPython可以使用magic命令模仿Matlab行为%pylab
or %matplotlib
它做了一些我还不明白的事情,这正是我问题的重点。
我的目标是允许独立的 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()
有什么替代方案%matplotlib
当脚本在 Python(不是 IPython)中运行时,我可以用来操作数字吗?
我已经研究过哪些解决方案?
我目前找到了 3 种获得情节展示的方法。
1. %pylab
/ %matplotlib
As tom说,使用%pylab
应避免,以防止名称空间被污染。
>>> %pylab
>>> plot([1,2,3,4])
这个解决方案很贴心,剧情无阻塞,不需要额外的show()
,我仍然可以添加一个网格grid()
之后,我可以关闭、调整或缩放我的图形,而不会出现其他问题。
不幸的是%matplotlib
命令仅在 IPython 上可用。
2. from pylab import *
or from matplotlib.pyplot import plt
>>> from pylab import *
>>> plot([1,2,3,4])
这里的情况完全不同。我需要添加命令show()
显示我被阻挡的图形。除了关闭图形以执行下一个命令之外,我无能为力,例如grid()
由于该图现已关闭,因此不会产生任何影响......
** 3. from pylab import *
or from matplotlib.pyplot import plt
+ ion()
**
一些建议建议使用ion()
命令如下:
>>> from pylab import *
>>> ion()
>>> plot([1,2,3,4])
>>> draw()
>>> pause(0.0001)
不幸的是,即使绘图显示,我也无法手动关闭该图。我需要执行close()
在终端上,这不是很方便。此外还需要两个额外的命令,例如draw(); pause(0.0001)
不是我所期待的。
Summary
With %pylab
,一切都很棒,但我无法在 IPython 之外使用它
With from pylab import *
随后是一个plot
,我遇到了阻塞行为,IPython 的所有功能都被浪费了。
from pylab import *
其次是ion
提供了一个很好的替代前一个的方法,但我必须使用奇怪的pause(0.0001)
命令导致我无法手动关闭窗口(我知道pause
某些后端不需要。我在用WxAgg
这是唯一一个效果很好的Cygwin x64
.
This question使用建议matplotlib.interactive(True)
。不幸的是,它不起作用并给出与以下相同的行为ion()
does.