我正在尝试编写一个脚本,用于保存绘图中前两次鼠标点击的坐标(通过matplotlib生成),暂停脚本直到发生这些点击。我试图用while循环实现“暂停”,一旦回调函数检测到鼠标被点击两次就应该完成。但是,一旦while循环开始运行,单击绘图区域似乎没有任何效果。任何帮助将不胜感激。
coords = []
pause = True
fig, ax = plt.subplots()
plt.pcolormesh(x_grid, y_grid, arr)
plt.show()
def onclick(event):
global coords
coords.append((event.xdata, event.ydata))
if (len(coords)==2):
pause = False
fig.canvas.mpl_disconnect(cid)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
while pause:
pass
# ...More code to follow, after the while loop finishes
答案 0 :(得分:1)
编辑答案: 我会调查这样的东西,他们有一个演示应用程序,但这似乎正是你想要的功能。
https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.ginput.html
这会将您的代码转换为:
plt.pcolormesh(x_grid, y_grid, arr)
coords = plt.ginput(2, show_clicks=False)
plot.show(block=False)
这将返回窗口中的前两个单击坐标,并打开图。
- 原始答案
您是否关注点击后打开的情节?如果没有,那么您可以删除while循环,因为plt.show()
函数本身就是阻塞的。然后是新版本的代码:
coords = []
fig, ax = plt.subplots()
plt.pcolormesh(x_grid, y_grid,arr)
def onclick(event):
global coords
coords.append((event.xdata, event.ydata))
if (len(coords)==2):
fig.canvas.mpl_disconnect(cid)
plt.close()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
print('Finished')
你可以随时(假设情节不会超长渲染)之后只需要打电话:
plt.pcolormesh(x_grid, y_grid, arr)
plt.show(block=False)
在点击过程完成后生成绘图的非阻止版本。 (这似乎很愚蠢,但我似乎无法找到一种快速的方法将阻塞图转换为非阻塞图)