在代码终止后保持matplotlib/pyplot窗口打开
我想用Python画一个图,然后在不阻塞程序运行的情况下显示这个图,并且在代码执行完后让这个图保持打开状态。这样做可以吗?
这个问题和相关主题在很多其他讨论中都有提到,但我就是无法让图既保持打开,又不阻塞程序运行。比如,如果我在调用pyplot.show()
之前使用pyplot.ion()
,或者使用pyplot.show(block=False)
,那么当代码结束时,图就会关闭。这在使用python
或ipython
时都是这样。如果有关系的话,我是在OS X 10.8.2(山狮)上运行python27
和ipython27
。
相关讨论:
pylab matplotlib "show" 等待直到窗口关闭
有没有办法让matplotlib图表分离,以便计算可以继续?
在Matplotlib中保持绘图窗口打开
关闭pyplot窗口
2 个回答
-1
虽然这可能不是直接回答问题,但我发现最简单的办法是使用show(block=False)并在后台运行脚本。这样,图表就会保留在屏幕上,而你可以回到命令行提示符,等你关闭图表窗口时,脚本就会结束。
6
在Linux系统上,你可以通过这种方式来分离显示:
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os
def detach_display():
mu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100)
plt.plot(x, mlab.normpdf(x, mu, sigma))
plt.show()
if os.fork():
# Parent
pass
else:
# Child
detach_display()
主程序结束了,但图形仍然显示。
尝试 #2。这种方法在Linux上也有效;你可以试试看:但在OS X上不行。
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os
import multiprocessing as mp
def detach_display():
mu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100)
plt.plot(x, mlab.normpdf(x, mu, sigma))
plt.show()
proc = mp.Process(target=detach_display)
proc.start()
os._exit(0)
如果没有使用 os._exit(0)
,主程序会被阻塞。按下Ctrl-C会结束主程序,但图形仍然显示。
使用 os._exit(0)
后,主程序结束,但图形仍然显示。
唉,尝试 #3。如果你把matplotlib的调用放在另一个脚本里,那么你可以像这样使用子进程:
show.py:
import matplotlib.pyplot as plt
import numpy as np
import sys
filename = sys.argv[1]
data = np.load(filename)
plt.plot(data['x'], data['y'])
plt.show()
test.py
import subprocess
import numpy as np
import matplotlib.mlab as mlab
mu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100000)
y = mlab.normpdf(x, mu, sigma)
filename = '/tmp/data.npz'
np.savez(filename, x=x, y=y)
proc = subprocess.Popen(['python', '/path/to/show.py', filename])
运行 test.py
应该会显示一个图形,并将控制权返回给终端,同时保持图形显示。