CLI程序,显示matplotlib图并继续执行程序

时间:2012-09-11 12:28:50

标签: python matplotlib command-line-interface

  

可能重复:
  How to make the plot not disappear?

我正在编写一个命令行界面python程序来分析一些数据。它向用户询问了一堆问题,并在脚本中的几个点上显示了一个matplotlib pyplot图,但我想显示它并继续使用下面的脚本:

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
plt.plot(np.arange(10),np.arange(10)**2)

plt.show()
print 'continuing the program'

我尝试过使用plt.draw()和子图,但它似乎不适用于脚本。

编辑: 我使用了plt.ion()除了绘图窗口没有响应之外哪种工作,并且没有显示放大工具等按钮

1 个答案:

答案 0 :(得分:2)

在用户关闭窗口小部件/窗口之前,

plt.show()将不会返回。我很多情况下这种行为很好。为什么在用户花时间查看精彩图表时脚本会继续? :-)但是,如果您要求继续执行程序,请使用threading模块。在让主线程终止之前,在新线程和plt.show()此线程中调用join()

编辑:

事情看起来并不那么简单。我创建了以下test.py

import threading
from matplotlib import pyplot as p
import time

p.plot([_ for _ in xrange(5)])

t = threading.Thread(target=p.show)
t.start()

for i in xrange(5):
    print "lala %s" % i
    time.sleep(1)

print "Waiting for plot thread to finish..."
t.join()
print "Finished."

测试它会导致此错误:

14:43:42 $ python test.py
lala 0
lala 1
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.6/threading.py", line 484, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 73, in show
    manager.show()
  File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 385, in show
    if not self._shown: self.canvas._tkcanvas.bind("<Destroy>", destroy)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 988, in bind
    return self._bind(('bind', self._w), sequence, func, add)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 938, in _bind
    needcleanup)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1101, in _register
    self.tk.createcommand(name, f)
RuntimeError: main thread is not in main loop

我从中推断出需要从主线程调用p.show()。也许你必须以相反的方式做到这一点:在另一个线程中获取用户输入。