在 Jupyter Notebook 中使用 ipywidgets 通过鼠标单击捕获 Matplotlib 坐标

问题描述 投票:0回答:1

简短问题

我想通过用鼠标在 Jupyter Notebook 内的 Matplotlib 图上单击不同位置来捕获坐标。我想使用

ipywidgets
without 使用任何 Matplotlib 魔法命令(如
%matplotlib ipympl
)来切换后端,并且 without 使用除 Matplotlib、ipywidgets 和 Numpy 之外的额外软件包。

详细说明

我知道如何使用 ipympl 包 和相应的 Jupyter magic 命令

%matplotlib ipympl
将后端从
inline
切换到
ipympl
(参见此处).

来实现此目的

安装后

ipympl
,例如使用
conda install ipympl
,并切换到
ipympl
后端,可以按照 此过程 在 Matplotlib 中捕获鼠标点击坐标。

import matplotlib.pyplot as plt

# Function to store mouse-click coordinates
def onclick(event):
    x, y = event.xdata, event.ydata
    plt.plot(x, y, 'ro')
    xy.append((x, y))

# %%
# Start Matplotlib interactive mode
%matplotlib ipympl  

plt.plot([0, 1])
xy = []     # Initializes coordinates
plt.connect('button_press_event', onclick)

enter image description here

但是,我发现在笔记本中在

inline
ipympl
后端之间来回切换非常令人困惑。

在 Jupyter Notebook 中进行交互式 Matplotlib 绘图的另一种方法是使用 ipywidgets 包。例如,使用

interact
命令,可以轻松地为 Matplotlib 绘图创建滑块,而无需切换后端。 (参见此处)

from ipywidgets import interact
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi)

def update(w=1.0):
    plt.plot(np.sin(w * x))
    plt.show()

interact(update);

enter image description here

但是,我还没有找到使用

ipywidgets
包从鼠标点击捕获
(x,y)
坐标的方法,相当于我上面使用
ipympl
的示例。

python numpy matplotlib jupyter-notebook ipywidgets
1个回答
0
投票

据我所知,单独使用 ipywidgets 可能不起作用,因为 interact() 用于与小部件交互,而不是直接捕获绘图上的点击。你探索这个问题是对的,我认为这是不可能的。

在具有默认内联后端的 Jupyter Notebook 中,绘图变得非交互式。为了使绘图本身响应点击,您需要切换后端,例如使用 ipympl(交互式后端)。内联渲染不会捕获鼠标事件。

有一个例子:

# pip install ipympl      oviously

%matplotlib widget
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

def onclick(event):
    print(f'Coordinates: ({event.xdata}, {event.ydata})')

fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

这使您可以单击绘图并以交互方式捕获坐标! 就像我说的,我不确定,但我个人认为你问题的答案是否定的。 不能直接走,但我们可以绕着走。

© www.soinside.com 2019 - 2024. All rights reserved.