![](/img/trans.png)
[英]How to keep the current figure when using ipython notebook with %matplotlib inline?
[英]How to wait for the user to click a point in a figure in IPython notebook?
我采取了以下步驟在 Google Colab notebook 中設置 IPython 后端:
!pip install ipympl
from google.colab import output
output.enable_custom_widget_manager()
然后我記錄用戶點擊圖形的 (x,y) 位置:
%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
def onclick(event):
ix, iy = event.xdata, event.ydata
print(ix, iy)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
我需要代碼在這里等待,直到用戶選擇至少一個數據點。 但是,如果我在同一個筆記本中有另一個命令,代碼將運行,例如:
print ('done!')
將在不等待用戶選擇數據點的情況下運行。 我之前嘗試過使用它:
plt.waitforbuttonpress()
print('done!')
但是,編譯器會卡在 plt.waitforbuttonpress() 處,並且不允許用戶單擊圖形。 謝謝你的幫助
您可以不將要運行的代碼放在button_press_event
之后,而是放在事件偵聽器之后,而是將其放在onclick
函數中。 像這樣:
%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
def onclick(event):
ix, iy = event.xdata, event.ydata
print(ix, iy)
print('done!')
cid = fig.canvas.mpl_connect('button_press_event', onclick)
要么:
%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
def after_onclick():
print('done!')
def onclick(event):
ix, iy = event.xdata, event.ydata
print(ix, iy)
after_onclick()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
這樣做的原因是因為mpl_connect
工作起來很奇怪(見這個問題)。 它不會等待事件被注冊並暫停代碼執行,而是運行整個文件但保持事件偵聽器打開。
這種方式的問題是每次注冊事件時都會運行代碼。
如果那不是您想要的,並且您只希望它運行一次,請嘗試以下操作:
%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
def after_onclick():
print('done')
fig.canvas.mpl_disconnect(cid)
def onclick(event):
ix, iy = event.xdata, event.ydata
print(ix, iy)
after_onclick()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
該版本添加了fig.canvas.mpl_disconnect(cid)
以便代碼只運行一次。
如果您在本地運行普通筆記本而不是 Colab,例如在 VSCode 中,您還可以使用figure.ginput(n=1)
以阻塞方式等待用戶點擊。
fig, ax = plt.subplots()
clicks = fig.ginput(n=1)
print('Done:', clicks)
輸出:
Done: [(9.070766129032256, 0.17960461218983856)]
在 Jupyter + VSCode 上對此進行了測試並且它有效,創建了一個供您單擊的窗口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.