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

7 投票
2 回答
5777 浏览
提问于 2025-04-17 19:21

我想用Python画一个图,然后在不阻塞程序运行的情况下显示这个图,并且在代码执行完后让这个图保持打开状态。这样做可以吗?

这个问题和相关主题在很多其他讨论中都有提到,但我就是无法让图既保持打开,又不阻塞程序运行。比如,如果我在调用pyplot.show()之前使用pyplot.ion(),或者使用pyplot.show(block=False),那么当代码结束时,图就会关闭。这在使用pythonipython时都是这样。如果有关系的话,我是在OS X 10.8.2(山狮)上运行python27ipython27

相关讨论:
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 应该会显示一个图形,并将控制权返回给终端,同时保持图形显示。

撰写回答