如何在按下某个键或单击鼠标之前暂停一个pylab图形?

时间:2013-03-23 03:18:38

标签: python matplotlib

我正在尝试使用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)行,以便程序暂停直到按下?

其他线程中建议的某些方法会暂停程序,但图片会消失或不会更新。

5 个答案:

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

检查documentation

matplotlib.pyplot.ginput(n=1, timeout=30, show_clicks=True, mouse_add=, mouse_pop=, mouse_stop=)

<块引用>

阻止调用与图形交互。

等待直到用户在图形上点击 n 次,然后返回 列表中每次点击的坐标。