来自matplotlib事件的全局变量

3 投票
1 回答
4289 浏览
提问于 2025-04-18 00:52

我正在尝试从一个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()

尽管我已经把“points”声明为全局变量,

print(points)

但还是出现了NameError错误。
我该如何获取“points”?
谢谢大家的帮助!!

1 个回答

4

你不能仅仅把一个变量声明为 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次后的图表。

示例图表

编辑

与其每次添加一个点时都绘制一个新的标记,不如修改你已经拥有的图表对象。像下面这样。

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 对象并重新绘制。

撰写回答