24

这是我所追求的 MWE,改编自这个问题

from matplotlib.pyplot import plot, draw, show

def make_plot():
    plot([1,2,3])
    draw()
    print 'continue computation'

print('Do something before plotting.')
# Now display plot in a window
make_plot()

answer = raw_input('Back to main and window visible? ')
if answer == 'y':
    print('Excellent')
else:
    print('Nope')

show()

我想要的是:我调用函数来制作绘图,出现绘图窗口,然后我回到提示符,以便我可以输入一些值(基于刚刚显示的图像)并继续使用代码(然后窗口可以关闭或保留在那里,我不在乎)。

相反,我得到的是带有绘图的窗口仅在代码完成出现,这不好。


添加 1

我已经尝试了以下相同的结果,绘图窗口出现在代码的末尾而不是之前:

from matplotlib.pyplot import plot, ion, draw

ion() # enables interactive mode
plot([1,2,3]) # result shows immediately (implicit draw())
# at the end call show to ensure window won't close.
draw()

answer = raw_input('Back to main and window visible? ')
if answer == 'y':
    print('Excellent')
else:
    print('Nope')

如果我更改draw()show().


添加 2

我尝试了以下方法:

from multiprocessing import Process
from matplotlib.pyplot import plot, show

def plot_graph(*args):
    for data in args:
        plot(data)
    show()

p = Process(target=plot_graph, args=([1, 2, 3],))
p.start()

print 'computation continues...'

print 'Now lets wait for the graph be closed to continue...:'
p.join()

这会导致消息Python kernel has crashed出错Canopy

The kernel (user Python environment) has terminated with error code -6. This may be due to a bug in your code or in the kernel itself.

Output captured from the kernel process is shown below.

[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing /tmp/tmp9cshhw.json
QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries.
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python: ../../src/xcb_io.c:274: poll_for_event: La declaración `!xcb_xlib_threads_sequence_lost' no se cumple.

我应该提到我正在运行Canopyelementary OS基于Ubuntu 12.04.


添加 3

还尝试了此问题中发布的解决方案:

import numpy
from matplotlib import pyplot as plt

if __name__ == '__main__':
    x = [1, 2, 3]
    plt.ion() # turn on interactive mode
    for loop in range(0,3):
        y = numpy.dot(x, loop)
        plt.figure()
        plt.plot(x,y)
        plt.show()
        _ = raw_input("Press [enter] to continue.")

随着代码的推进(即:用户点击 [enter]),这将显示空的绘图窗口,并且仅在代码完成后显示图像。

此解决方案(也在同一个问题中)甚至不显示绘图窗口:

import numpy
from matplotlib import pyplot as plt
if __name__ == '__main__':
    x = [1, 2, 3]
    plt.ion() # turn on interactive mode, non-blocking `show`
    for loop in range(0,3):
        y = numpy.dot(x, loop)
        plt.figure()   # create a new figure
        plt.plot(x,y)  # plot the figure
        plt.show()     # show the figure, non-blocking
        _ = raw_input("Press [enter] to continue.") # wait for input from the user
        plt.close()    # close the figure to show the next one.
4

3 回答 3

28

您可以使用plt.show(block=False), 直接摆脱阻塞。

对于你的例子,这可以读

from matplotlib.pyplot import plot, show

def make_plot():
    plot([1,2,3])
    show(block=False)
    print('continue computation')

print('Do something before plotting.')
# Now display plot in a window
make_plot()

answer = input('Back to main and window visible? ')
if answer == 'y':
    print('Excellent')
else:
    print('Nope')
于 2013-06-17T14:24:24.997 回答
13

所提出的解决方案都不适合我。我使用 Python 3.6 下的(当前)最新的 Matplotlib 2.1 使用三个不同的 IDE PyCharmSpyderPyzo对它们进行了测试。

对我有用的,虽然不是最优的,是使用一个plt.pause命令:

import matplotlib.pyplot as plt

def make_plot():
    plt.plot([1, 2, 3])
#    plt.show(block=False)  # The plot does not appear.
#    plt.draw()             # The plot does not appear.
    plt.pause(0.1)          # The plot properly appears.
    print('continue computation')

print('Do something before plotting.')
# Now display plot in a window
make_plot()

answer = input('Back to main and window visible? ')
if answer == 'y':
    print('Excellent')
else:
    print('Nope')
于 2017-10-31T15:07:01.083 回答
1

我不能让它工作Canopy(至少现在还不能),但我可以让代码像我想使用GeanyIDE 一样运行。这是对我有用的代码,它是对问题中第一个代码块的一个非常小的修改,其中show()命令从文件末尾移动到命令下方make_plot()

from matplotlib.pyplot import plot, draw, show

def make_plot():
    plot([1,2,3])
    draw()
    print 'Plot displayed, waiting for it to be closed.'

print('Do something before plotting.')
# Now display plot in a window
make_plot()
# This line was moved up <----
show()

answer = raw_input('Back to main after plot window closed? ')
if answer == 'y':
    print('Move on')
else:
    print('Nope')

它并不完全符合我的要求,但已经足够接近:它向用户显示一个绘图,等到该绘图窗口关闭,然后继续执行代码。理想情况下,它不应该等到绘图窗口关闭才能继续使用代码,但我猜总比没有好。

上面Add 2部分中的代码也以相同的方式工作,并且不需要在 中进行修改Geany,但我更喜欢这个,因为它更简单。如果(何时?)我可以使用它,我会更新这个答案Canopy

于 2013-07-14T15:17:03.097 回答