我在使用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()