我在使用matplotlib突出显示python绘图中的对应点时遇到问题。我尝试使用当鼠标(onpick)单击该点时从图读取数据的函数来完成此操作。然后,我尝试在其他相邻地块中注释此信息。我在annotate命令中使用onpick函数中的变量时遇到问题。我想在ind命令中使用onpick函数中的annotate参数,但是python没有看到它。这是onpick函数:

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    global ind
    ind = event.ind
    print('x:', xdata[ind],'y:',ydata[ind])


我使用以下命令调用该函数:

fig.canvas.mpl_connect('pick_event', onpick)


注释:

ax = plt.subplot2grid((lg, 2), (0, 0), colspan=2)
    ax.plot(t, mp, picker=1)
    ax.set_title('map')
    ax.annotate('here',(t[ind],mp[ind]),xytext=(0.8,0.9),
                arrowprops=dict(facecolor='grey',color='grey'))


Python命令框显示:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\kubag\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:/Users/kubag/Desktop/pyton/wykres/wykres.py", line 78, in graph
    ax.annotate('here',(t[ind],mp[ind]),xytext=(0.8,0.9),arrowprops=dict(facecolor='grey',color='grey'))
NameError: name 'ind' is not defined


整个代码:

import matplotlib.pyplot as plt

t=range(10)
mp=range(10)
v=range(10)

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    global ind
    ind = event.ind
    print('x:',int(xdata[ind]),'y:',int(ydata[ind]))
    global ind2
    ind2=int(ind)
    ax.annotate('miejsce', (t[ind2], mp[ind2]), xytext=(0.8, 0.9), arrowprops=dict(facecolor='grey'))

fig = plt.figure()
global ax
ax = plt.subplot2grid((1, 2), (0, 0))
ax.plot(t, mp, picker=1)

ax1 = plt.subplot2grid((1, 2), (0, 1))
ax1.plot(t, v, picker=1)

fig.canvas.mpl_connect('pick_event', onpick)
fig.canvas.draw()
plt.tight_layout()
plt.show()

最佳答案

在函数外定义ind;除非可以保证在使用global ind之前先调用onpick,否则在内部使用ind是不够的。

考虑

def fun():
    global i
    i = 10
print(i)


这引发了错误


NameError: name 'i' is not defined



print(i)

然而,

def fun():
    global i
    i = 10
fun()
print(i)


工作完美。因此,如果您不能确保在使用变量(fun)之前先调用函数(i),则只需在函数外部定义变量:

i = 0
def fun():
    global i
    i = 10
print(i)


这样,可以使用i而不管是否已调用该函数。

---

 编辑

致电

fig.canvas.draw()


需要在onpick函数内部和ax.annotate之后,而不是在使用

fig.canvas.mpl_connect('pick_event', onpick)


否则,在PickEvent之后不会更新画布。所以onpick应该看起来像这样

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    global ind
    ind = event.ind
    print('x:',int(xdata[ind]),'y:',int(ydata[ind]))
    global ind2
    ind2=int(ind)
    ax.annotate('miejsce', (t[ind2], mp[ind2]), xytext=(0.8, 0.9),
                arrowprops=dict(facecolor='grey'))
    fig.canvas.draw()

10-06 05:22