在代码终止后保持matplotlib / pyplot窗口打开

时间:2013-03-16 20:51:18

标签: python matplotlib plot

我想让python制作一个情节,在不阻挡控制流的情况下显示它,并在代码退出后保持图表打开。这可能吗?

这个以及相关的主题在许多其他主题中存在(见下文),但是我无法让情节保持开放,并且是非阻塞的。例如,如果我在pyplot.ion()之前使用pyplot.show(),或者如果我使用pyplot.show(block=False),则在代码终止时图表会关闭。使用pythonipython都是如此。如果重要,我正在运行OS X 10.8.2(Mountain Lion),运行python27ipython27

相关讨论:
pylab matplotlib "show" waits until window closes
Is there a way to detach matplotlib plots so that the computation can continue?
Keep plotting window open in Matplotlib
Closing pyplot windows

2 个答案:

答案 0 :(得分: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应该显示一个图并将控制返回到终端,同时显示图。

答案 1 :(得分:-1)

虽然这可能不能直接回答这个问题,但我发现最简单的实际问题是(使用show(block = False)并在后台运行脚本)。这样一来,情节仍然存在,你又回到shell提示符下,当你杀死绘图窗口时脚本会退出......