You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly FigureWidget中go.Image对象on_click点击事件未触发

问题根因

go.Image的on_click事件未触发,由以下几个问题共同导致:

  • 未开启Figure的点击事件模式:Plotly FigureWidget默认不对go.Image类型的图层派发点击事件,必须手动在layout中设置clickmode为event或event+select才会触发回调。
  • 回调函数参数不匹配:on_click绑定的回调函数固定接收3个参数:图层trace对象、点击命中的点数据、选择器状态,仅定义1个参数会导致事件触发时抛出静默错误,Jupyter前端不会直接展示该报错。
  • 代码存在笔误与格式问题:
    • 定义的base64编码函数名为image_to_jpeg_b64,调用时误写为不存在的image_jpeg_b64变量
    • 实际编码的是JPEG格式图像,source的MIME类型却写为image/png,虽部分浏览器可兼容解析,但不符合规范。
修正后可运行代码
import plotly.graph_objects as go
import numpy as np
import base64
import cv2

def image_to_jpeg(frame, to_bgr=True) -> bytes:
    frame = frame if not to_bgr else cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
    _, jpeg = cv2.imencode(".jpeg", frame)
    return jpeg.tobytes()


def image_to_jpeg_b64(frame, to_bgr=True) -> str:
    return base64.b64encode(image_to_jpeg(frame, to_bgr=to_bgr)).decode("utf-8")

# 替换为实际的图像读取逻辑,示例用随机生成的RGB图测试
test_frame = np.random.randint(0, 255, (480, 640, 3), dtype=np.uint8)
image_b64_str = image_to_jpeg_b64(test_frame)

# 修正MIME类型匹配JPEG格式
go_image = go.Image(source=f"data:image/jpeg;base64,{image_b64_str}")

# 修正回调函数参数签名
def on_image_click(trace, points, state):
    print("点击事件触发,命中点信息:", points.point_inds)
    if points.xs:
        print(f"点击像素坐标 X: {points.xs[0]}, Y: {points.ys[0]}")

go_image.on_click(on_image_click)

f = go.FigureWidget(
    [go_image],
    # 关键配置:开启点击事件派发
    layout=go.Layout(clickmode="event")
)

f # Jupyter单元格中直接输出即可交互
补充说明
  • 回调中points参数的xs、ys属性对应点击位置的图像像素坐标,可直接用于选点标注、交互取值等逻辑。
  • 如果需要同时支持框选交互,将clickmode改为event+select即可,额外绑定on_selection事件可获取框选的坐标范围。
  • 运行前需确认Plotly版本≥4.0,且Jupyter环境已正确安装plotlywidget扩展,否则FigureWidget的所有交互事件都会失效。

运行效果展示

内容的提问来源于stack exchange,提问作者ntakouris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:06:24