在Matplotlib GUI回调函数中访问数据

时间:2016-04-07 16:06:34

标签: python matplotlib

我是Python新手,对面向对象编程有些新手。任何人都可以通过matplotlib GUI回调解释发生了什么以及通常如何完成工作?我从Matplotlib网站上获取了“event_handling示例代码”并将其删除以便清楚。当您运行此代码时,它会生成一个图表,如果您按下键盘上的某个键,则会调用功能。 功能仅传递事件,但不知何故,来自主程序级别的所有其他变量都出现在的调用中,但作为全局变量,这是函数的正常吗?我可以打印x的值,但如果我尝试更改它然后它会生成一个局部变量版本,更糟糕的是现在我似乎无法再访问全局版本了吗?

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

x=np.random.rand(3)
y=np.random.rand(3)

def press(event):
    print(x)    
    print('Local Var:', locals().keys())
    print('Global Var:', globals().keys())

fig, ax = plt.subplots()
fig.canvas.mpl_connect('key_press_event', press)
ax.plot(x,y)
plt.show()

我已经搜索并且很难找到解释如何访问或正确地将有用数据传入和传出回调函数的任何引用,以便GUI事件可以执行一些有用的操作,例如更新某些数据或功能情节?

所以我想说我想让回调函数修改y并重新绘制数据。这通常是怎么做的?

1 个答案:

答案 0 :(得分:0)

您拥有xcallback的全局访问权限,但除非您指定global,否则无法对其进行修改。

def press(event):
    global x
    ...

locals().keys()globals().keys()正在打印namespaces;我不确定你为什么需要那样做。

您的callback收到一个event,您可以在该功能中使用和操作。

以下是一个例子:

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

x=np.random.rand(3)
y=np.random.rand(3)

def press(event):
    print(event, event.key)

fig, ax = plt.subplots()
fig.canvas.mpl_connect('key_press_event', press)

ax.plot(x,y)
plt.show()

click on the plot window to set the focus.

按f应打印事件对象并将图表设置为全屏 再次按f,将打印f并恢复窗口的大小 按s将打印s并将提供保存您的数字 等...

要详细了解如何操纵events,请在非常丰富的backend_bases网站中查找matplotlib。例如,您可以设置mouse_clicks事件,以便捕获画布坐标以添加点或修改数字......