来自matplotlib事件的全局变量

时间:2014-04-01 14:37:56

标签: python events matplotlib global

我正在尝试从matplotlib事件中检索数组作为输出:

import numpy as np
import matplotlib.pyplot as plt

def onclick(event):
    global points
    try:
        points = np.append(points,[[event.xdata,event.ydata]],axis=0)
    except NameError:
        points = np.array([[event.xdata,event.ydata]])
    ax.plot(points[:,0],points[:,1],'o')
    plt.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim((0,10))
ax.set_ylim((0,10))
plt.gcf().canvas.mpl_connect('button_press_event',onclick)
plt.show()

即使很难,我也宣称“点”是全球性的,

print(points)

返回NameError。 如何检索“积分”? 谢谢你的帮助!!

1 个答案:

答案 0 :(得分:3)

您不能将变量声明为global,您必须先创建它。以下代码应该按预期工作。

import numpy as np
import matplotlib.pyplot as plt

points = []

def onclick(event):
    global points
    points.append([event.xdata, event.ydata])

    ax.plot(event.xdata, event.ydata,'o')
    plt.draw()

fig = plt.figure()
ax = fig.add_subplot(111)

ax.set_xlim((0, 10))
ax.set_ylim((0, 10))

plt.gcf().canvas.mpl_connect('button_press_event', onclick)

plt.show()

下面显示的是我点击5次后的情节。

Example plot

修改

您可以改为修改已有的绘图对象,而不是每次添加一个点时都绘制一个新标记。如下所示。

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

ax.set_xlim((0, 10))
ax.set_ylim((0, 10))

points = []

line, = ax.plot(points, 'o--')

def onclick(event):
    global points
    points.append([event.xdata, event.ydata])

    line.set_data(zip(*points))
    plt.draw()

plt.gcf().canvas.mpl_connect('button_press_event', onclick)

plt.show()

这将绘制points一次,然后每当用户点击图表时,它将修改line对象并重新绘制它。