PyCharm matplotlib交互式数字没有阻塞执行

时间:2017-02-06 16:20:32

标签: python matplotlib pycharm

我读了很多关于这个主题的堆栈溢出问题,但经过大量的实验,我无法弄清楚我的问题。

我在Windows 7上使用PyCharm 2016.3.2(但我在OSX上遇到同样的问题),我的解释器是使用Python 3.6和matplotlib 2.0.0的Anaconda的最后一个版本。

这是我尝试实现的目标(也许我没有使用正确的方法,因为我正在尝试重新创建我在Octave / Matlab中使用的行为):

  1. 在弹出窗口中绘制一个数字
  2. 暂停我的脚本(输入("按一个键继续"))
  3. 观察图,然后按一个键继续脚本
  4. 计算别的东西
  5. 在同一图上绘制新数据
  6. 暂停我的脚本(输入("按一个键继续"))
  7. 观察图,然后按一个键继续脚本
  8. 这是我的测试代码:

    import matplotlib
    matplotlib.use('TkAgg')
    import matplotlib.pyplot as plt
    
    print('Plotting Data...')
    
    plt.ion()
    plt.figure(1)
    plt.plot([1, 5, 10, 20], [1, 5, 10, 20])
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.show()
    plt.pause(0.0001)
    
    input('Plotting Data done..., Press a key to continue')
    
    plt.figure(1)
    plt.plot([1, 5, 10, 20], [2, 10, 20, 40])
    plt.show()
    plt.pause(0.0001)
    
    input('Program paused. Press enter to end.\n')
    

    这是我想要的最接近的版本,图表是正确的,但是当我将鼠标悬停在它们上时没有响应(plt.pause(0.0001)生成警告但代码有效)。

    我玩了很多参数(plt.ion(); plt.pause(); plt.show(block = False))。 大多数情况下,这会导致空图窗口或我需要关闭窗口以继续执行。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

调用plt.show()后,主循环将由Window接管。因此,只要input被调用,主循环就会变得无法响应。

您可以尝试保持GUI循环并按下那里的按键。

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

print('Plotting Data...')

fig, ax = plt.subplots()
ax.set_xlabel('x label')
ax.set_ylabel('y label')
i=[0]

def f1():
    ax.plot([1, 5, 10, 20], [1, 5, 10, 20])

def f2():
    ax.plot([1, 5, 10, 20], [2, 10, 20, 40])

def f3():
    ax.plot([1, 5, 10, 20], [5, 9, 17, 28])


def update(event=None):
    if i[0]==0: f1()
    if i[0]==1: f2()
    if i[0]==2: f3()
    fig.canvas.draw_idle()
    i[0]+=1
    print('Step {} done..., Press a key to continue'.format(i[0]))

fig.canvas.mpl_connect("key_press_event", update)    

update()
plt.show()