来自matplotlib事件的全局变量
我正在尝试从一个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
对象并重新绘制。