我读了很多关于这个主题的堆栈溢出问题,但经过大量的实验,我无法解决我的问题。
我在Windows7上使用PyCharm 2016.3.2(但在OSX上也有同样的问题),我的解释器是Anaconda的最后一个版本,带有Python 3.6和matplotlib 2.0.0。
以下是我试图实现的目标(也许我没有使用正确的方法,因为我试图在Octave/Matlab中重现我习惯的行为):
- 在弹出窗口中绘制一个图形
- 暂停我的脚本(输入("按键继续")
- 观察图,然后按键继续脚本
- 计算其他内容
- 在同一图上绘制新数据
- 暂停我的脚本(输入("按键继续")
- 观察图,然后按键继续脚本
这是我的测试代码:
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(块=假))。大多数时候,这会导致绘图窗口为空,或者我需要关闭窗口才能继续执行。
谢谢你的帮助!
一旦调用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()