2016-07-13 8 views
0

Товарищи,Как сохранить графики matplotlib после завершения процесса

У меня есть функция, которая должна генерировать некоторые графики matplotlib, а затем прекращаться. Я хочу, чтобы сюжеты остались после того, как они закончились.

  • Если я устанавливаю интерактивный режим, график появляется, не блокируется, а затем исчезает, когда моя функция завершается. Я не хочу этого.
  • Если я отключил интерактивный режим, появится график, затем блокируется, пока вы его не закроете, а затем функция прекратится. Я тоже этого не хочу.

Желаемое поведение: График появляется, не блокируется и остается после завершения функции.

Итак, люди, есть ли способ сделать это? Наиболее вероятный подход, по-видимому, является многопроцессорной. Я бы подумал, следующий код будет работать:

from multiprocessing import Process 
import matplotlib.pyplot as plt 
import numpy as np 

def plot_graph(): 
    plt.plot(np.random.randn(10)) 
    plt.show() 

p = Process(target=plot_graph) 
p.start() 

Но это ничего (по крайней мере, на MacOS, бэкенд TkAgg)

Я знаю, что могу просто сохранить рисунок как изображение и открыть не показывать изображение, но это не совсем то, что я хочу - я бы все еще был в состоянии использовать элементы управления масштабированием matplotlib и т. д.

+0

Попробуйте переместить 'plt.show()' после 'p.start()'? – DavidG

+0

Что вы имеете в виду? show вызывается после запуска, в новом процессе. – Peter

ответ

0

Он должен работать, но ваш ведет себя так, как будто show() не блокирует. Попробуйте добавить plt.ioff(), как показано ниже.

from multiprocessing import Process 
import matplotlib.pyplot as plt 
import numpy as np 

def plot_graph(): 
    plt.plot(np.random.randn(10)) 
    plt.show() 

plt.ioff() 
p = Process(target=plot_graph) 
p.start() 
+0

Не работает для меня ... Это сработало для вас? – Peter

+0

Да, но он работает и без паузы. Если ваша программа заканчивается (она должна блокироваться командой show), попробуйте добавить plt.ioff() перед установкой p = ... Я изменил свой первоначальный ответ выше –

+0

Хммм .. спасибо, но не кубик. Если это сработает для вас, а не для меня, это должен быть какой-то сюжетный вопрос. – Peter

Смежные вопросы