Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在Python中运行脚本时如何操作图形? 介绍_Matlab_Matplotlib_Python - Fatal编程技术网

Matlab 在Python中运行脚本时如何操作图形? 介绍

Matlab 在Python中运行脚本时如何操作图形? 介绍,matlab,matplotlib,python,Matlab,Matplotlib,Python,在我出生的时候,我习惯了一个交互式界面,在这个界面上,脚本可以在运行时更新图形。在处理过程中,每个图形都可以重新调整大小甚至闭合。这可能意味着每个图形都在其自己的线程中运行,这显然与实际情况不同 IPython可以使用magic命令%pylab或%matplotlib来模拟Matlab行为,这是我的问题所在 然后,我的目标是允许独立的Python脚本像Matlab一样工作(或者像IPython和%matplotlib一样工作)。换句话说,我希望这个脚本从命令行执行。我期待着每3秒钟就会出现一个新

在我出生的时候,我习惯了一个交互式界面,在这个界面上,脚本可以在运行时更新图形。在处理过程中,每个图形都可以重新调整大小甚至闭合。这可能意味着每个图形都在其自己的线程中运行,这显然与实际情况不同

IPython可以使用magic命令
%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