我想通过点击图中的值来提取图中的值,同时在此时添加标记/删除旧标记。我只对一个图执行此操作,但在我的实践案例中,我有多个图。
当我有多个图时,点击事件只对最近的图有效。点击其他图将打印出最后一个图的值/在最后一个图中添加标记。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt
# Function to get the closest actual value
def find_nearest(array,value):
idx = (np.abs(array-value)).argmin()
return array[idx]
# Function to ectract the value from the graph by clicking
def onclick(event,x,y,fig):
if event.inaxes is not None:
ix = find_nearest(x,event.xdata )
iy = y[np.where(x==ix)[0][0]]
text = (f'x = {ix}, y = {iy}\n')
ax1 = fig.get_axes()[0]
# Update the plots
if len(ax1.get_lines()) > 1:
delete = ax1.get_lines()[-1]
delete.remove()
ax1.plot([ix],[iy],marker="x",color="b")
fig.canvas.draw_idle()
print(text)
# test case
x = np.arange(0,10,1)
y1 = x
y2 = x**2
y3 = x**3
f1 = [x,y1]
f2 = [x,y2]
f3 = [x,y3]
functions = [f1,f2,f3]
for f in functions:
fig, ax1 = plt.subplots(1)
ax1.plot(f[0],f[1])
#plt.show()
cid = fig.canvas.mpl_connect('button_press_event', lambda event: onclick(event,f[0],f[1],fig))
字符串
如果有人知道热修复它,这将是高度赞赏。
我已经试过把fig,ax 1和cid放入字典中,并调整函数参数,但这并没有改变任何东西。
有趣的是,如果我在没有循环的情况下绘制和调用函数,但是单独地进行3次,至少函数的坐标部分的检索工作。只有添加/删除标记不工作。
我在这里发现了一个类似的问题,但我不太明白答案。
2条答案
按热度按时间6l7fqoea1#
我试着写一个代码多个情节,但我不认为这是可能的。所以,我想出了一个主意-当你运行代码,所有的情节显示:
x1c 0d1x的数据
然后你可以点击其中一个。例如,如果你点击第二个图,它会像这样打开,
的
您可以点击这个图,它将显示标记并在终端中输出坐标。如果您想访问其他图,只需关闭此窗口。3个图将出现。然后您可以选择例如,第三个。然后如果您想终止代码,只需关闭原始窗口(具有所有3个子图的窗口)
下面是我的代码:
字符串
我希望这对你有帮助!
gc0ot86w2#
我能够弄清楚它。某种程度上,问题在于循环.我不知道确切的原因,但当我把数字放入字典,然后单独执行点击事件时,它工作了。但是,当我试图通过循环来做这件事时,它不工作。如果有人知道这种奇怪行为的原因,我很乐意得到解释。
然而,我最终解决这个问题的方法是添加一个函数,它执行click事件。通过这样做,我可以再次使用循环。
字符串