2013-03-16 21 views
6

私は、プロットを作成し、コントロールフローをブロックせずに表示し、コードが終了した後にプロットを開いたままにしておきたい。これは可能ですか?コード終了後にmatplotlib/pyplotウィンドウを開いたままにする

これと関連する主題は数多くの他のスレッドに存在しますが、私は両方ともオープンであり、ノンブロッキングであるというプロットは得られません。たとえば、pyplot.show()の前にpyplot.ion()を使用する場合、またはを使用すると、コードが終了するとプロットが閉じます。これは、pythonまたはipythonのいずれかを使用してtrueです。それが重要な場合は、私は、OS X 10.8.2(マウンテンライオン)上で実行しているよpython27ipython27

関連の議論実行している:あなたは、Linux上で
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

答えて

6

をすることができますディスプレイを次のように取り外します。

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._exit(0)なければメイン処理ブロックを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) 

上ではなく: あなたはそれを試してみるかもしれません。 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を実行すると、プロットを表示したまま端末に制御を戻します。

+0

これは私には「プロセスが分岐してしまったため、このCoreFoundation機能を安全に使用できません。あなたはexec()をしなければなりません。 デバッグするには、__THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY ___ YOU_MUST_EXEC __()をブレークします。 ' – DilithiumMatrix

+0

お詫び申し上げます。どうやらこのソリューションはLinux固有のものです。 – unutbu

+0

お試しをよろしくお願いいたします。 – DilithiumMatrix

-1

これは直接質問に答えることはできませんが、私が見つけた最も簡単な実用的なことは、(show(block = False)を使用して)、バックグラウンドでスクリプトを実行することです。そのプロットは残っていて、プロンプトウィンドウに戻り、プロットウィンドウを終了するとスクリプトが終了します...

関連する問題