matplotlib / matplotlib/ipympl

Error raised on mouse cursor hover with matplotlib>=3.10

未关闭
#594 25 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
Jupyter Notebook
星标
1.7k
派生
234
PR 合并指标
30 天内没有已合并 PR

描述

Describe the issue

Using matplotlib>=3.10.*, making any plot with ipympl raises an error when hovering the mouse over the axes.

Example:

import matplotlib.pyplot as plt
%matplotlib widget

fig, ax = plt.subplots()

Hovering the mouse over the plot raises

KeyError                                  Traceback (most recent call last)
File [~/miniforge3/lib/python3.12/site-packages/ipympl/backend_nbagg.py:278](http://localhost:8888/home/nvaytet/miniforge3/lib/python3.12/site-packages/ipympl/backend_nbagg.py#line=277), in Canvas._handle_message(self, object, content, buffers)
    275     self.manager.handle_json(content)
    277 else:
--> 278     self.manager.handle_json(content)

File [~/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_webagg_core.py:474](http://localhost:8888/home/nvaytet/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_webagg_core.py#line=473), in FigureManagerWebAgg.handle_json(self, content)
    473 def handle_json(self, content):
--> 474     self.canvas.handle_event(content)

File [~/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_webagg_core.py:264](http://localhost:8888/home/nvaytet/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_webagg_core.py#line=263), in FigureCanvasWebAggCore.handle_event(self, event)
    261 e_type = event['type']
    262 handler = getattr(self, f'handle_{e_type}',
    263                   self.handle_unknown_event)
--> 264 return handler(event)

File [~/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_webagg_core.py:295](http://localhost:8888/home/nvaytet/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_webagg_core.py#line=294), in FigureCanvasWebAggCore._handle_mouse(self, event)
    286 e_type = event['type']
    287 button = event['button'] + 1  # JS numbers off by 1 compared to mpl.
    288 buttons = {  # JS ordering different compared to mpl.
    289     button for button, mask in [
    290         (MouseButton.LEFT, 1),
    291         (MouseButton.RIGHT, 2),
    292         (MouseButton.MIDDLE, 4),
    293         (MouseButton.BACK, 8),
    294         (MouseButton.FORWARD, 16),
--> 295     ] if event['buttons'] & mask  # State *after* press[/release.](http://localhost:8888/release.)
    296 }
    297 modifiers = event['modifiers']
    298 guiEvent = event.get('guiEvent')

KeyError: 'buttons'

Note: need to set level to 'Debug' in log console to see it.

The figure is basically inactive.

Could be related to #592 but I did install 0.9.7 and it did not fix the issue.

Downgrading to matplotlib=3.9.4 fixes the issue.

Versions

 3.12.7 | packaged by conda-forge | (main, Oct  4 2024, 16:05:46) [GCC 13.3.0]
ipympl version: 0.9.7
Selected Jupyter core packages...
IPython          : 8.30.0
ipykernel        : 6.29.5
ipywidgets       : 8.1.5
jupyter_client   : 8.6.3
jupyter_core     : 5.7.2
jupyter_server   : 2.14.2
jupyterlab       : 4.3.1
nbclient         : 0.10.1
nbconvert        : 7.16.4
nbformat         : 5.10.4
notebook         : not installed
qtconsole        : not installed
traitlets        : 5.14.3

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

使用 notebook 示例在 matplotlib>=3.10 和 ipympl 0.9.7 下复现该问题,然后检查 backend_nbagg.py 以及 matplotlib 的 backend_webagg_core.py 中 Canvas._handle_message 和 _handle_mouse 附近的代码。完成的标准是:将鼠标悬停在坐标轴上不再引发 KeyError,并且图形仍保持交互性。

由索引模型根据 Issue 内容生成。

评估

技术栈
jupyter, jupyter-notebook, matplotlib, python
领域
backend, frontend
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
55/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。