我正在尝试使用pylab和networkx编写动画模拟。模拟并不是一直很有趣,所以大部分时间我都希望它能够快速进行,但是,我希望能够暂停它并在它看起来很有趣时看一下它。暂停屏幕直到按键才能解决我的问题,因为我可以按我想要的那样快速/慢速按键。
以下是一个示例情况:
import numpy as np
import networkx as nx
import pylab as plt
import sys
def drawGraph(matrix):
plt.clf()
G = nx.DiGraph(np.array(matrix))
nx.draw_networkx(G)
plt.draw()
plt.pause(1) #I want this pause to be replaced by a keypress
#so that it pauses as long as I want
A=[[0,1],[1,0]]
B=[[0,1],[0,0]]
x=1
while True:
if x==1:
drawGraph(A)
x=0
else:
drawGraph(B)
x=1
我应该如何重写plt.pause(1)行,以便程序暂停直到按下?
其他线程中建议的某些方法会暂停程序,但图片会消失或不会更新。
答案 0 :(得分:46)
有没有理由不使用waitforbuttonpress()?
import matplotlib.pyplot as plt
A=[[0,1],[1,0]]
B=[[0,1],[0,0]]
x=1
while True:
if x==1:
drawGraph(A)
x=0
else:
drawGraph(B)
x=1
plt.waitforbuttonpress()
正如它所说的那样,等待按键或按钮按下以执行某些操作。如果您想了解有关该事件的更多信息,它会返回值。很容易。
答案 1 :(得分:8)
使用鼠标单击停止并重新启动以下代码。它使用“TKAgg”后端:
import numpy as np
import networkx as nx
import matplotlib
matplotlib.use("TkAgg")
import pylab as plt
plt.ion()
fig = plt.figure()
pause = False
def onclick(event):
global pause
pause = not pause
fig.canvas.mpl_connect('button_press_event', onclick)
def drawGraph(matrix):
fig.clear()
G = nx.DiGraph(np.array(matrix))
nx.draw_networkx(G)
plt.draw()
A=[[0,1],[1,0]]
B=[[0,1],[0,0]]
x=1
while True:
if not pause:
if x==1:
drawGraph(A)
x=0
else:
drawGraph(B)
x=1
fig.canvas.get_tk_widget().update() # process events
答案 2 :(得分:2)
您可以等到用户按下raw_input()
后输入。
为了显示图表,应在导入后添加plt.ion()
。
我不认为在Python中按下某个键之前有任何简单的平台无关的等待方式,但是如果Enter不够,你可能想检查一下。
答案 3 :(得分:0)
plt.waitforbuttonpress()会在按下任何一个键后立即退出非活动状态 或单击鼠标。但是,如果按下键盘键,该函数将返回True;如果单击鼠标,则该函数将返回False。
要保持绘图直到按下键盘键:
keyboardClick=False
while keyboardClick != True:
keyboardClick=plt.waitforbuttonpress()
答案 4 :(得分:0)
您可以将 plt.pause(1)
中的 drawGraph()
替换为 plt.ginput()
matplotlib.pyplot.ginput(n=1, timeout=30, show_clicks=True, mouse_add=
阻止调用与图形交互。
等待直到用户在图形上点击 n 次,然后返回 列表中每次点击的坐标。