PyCharm matplotlib交互式图形,无需阻止执行



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

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

以下是我试图实现的目标(也许我没有使用正确的方法,因为我试图在Octave/Matlab中重现我习惯的行为):

  1. 在弹出窗口中绘制一个图形
  2. 暂停我的脚本(输入("按键继续")
  3. 观察图,然后按键继续脚本
  4. 计算其他内容
  5. 在同一图上绘制新数据
  6. 暂停我的脚本(输入("按键继续")
  7. 观察图,然后按键继续脚本

这是我的测试代码:

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()

相关内容

  • 没有找到相关文章

最新更新