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

如何在PyScript中实现Plotly图表点击事件以获取坐标?

解决PyScript中Plotly点击事件失效的问题

你的问题出在:通过json.dumps将Python端的Plotly图表对象转为JSON,再用JS的Plotly.newPlot渲染时,Python端绑定的on_click事件会丢失——因为此时渲染的是JS层面的图表实例,Python端的事件绑定无法作用于它。下面提供两种可行的解决方法:

方法一:通过JS事件监听实现(适配JSON转译的场景)

直接给图表的DOM元素绑定plotly_click事件,在PyScript中处理事件回调:

<html>
<head>
    <link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
    <script defer src="https://pyscript.net/latest/pyscript.js"></script>
    <script src='https://cdn.plot.ly/plotly-latest.min.js'></script>
    <py-config>
        packages = ['plotly','numpy','pandas']
    </py-config>
</head>
<body>
    <div id="chart1"></div>
    <py-script>
        import js, json, plotly
        import plotly.express as px

        fig = px.line(x=[1,2, 3], y=[1, 2, 3]) 
        graphJSON = json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)
        plot = js.Plotly.newPlot("chart1", js.JSON.parse(graphJSON))

        def handle_click(event):
            # 提取点击的坐标点
            for point in event.points:
                print(f"点击坐标:x={point.x}, y={point.y}")

        # 获取图表DOM元素并绑定点击事件
        chart_element = js.document.getElementById("chart1")
        chart_element.addEventListener("plotly_click", handle_click)
    </py-script>
</body>
</html>

说明:plotly_click是Plotly提供的原生JS事件,事件对象的points属性包含所有被点击的数据点信息,你可以从中提取x、y坐标等参数。

方法二:用Plotly原生Python渲染(更简洁)

跳过JSON转译步骤,直接用Plotly的Python API将图表渲染到指定div,这样可以保留Python端的事件绑定:

<html>
<head>
    <link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
    <script defer src="https://pyscript.net/latest/pyscript.js"></script>
    <script src='https://cdn.plot.ly/plotly-latest.min.js'></script>
    <py-config>
        packages = ['plotly','numpy','pandas']
    </py-config>
</head>
<body>
    <div id="chart1"></div>
    <py-script>
        import plotly.express as px
        from plotly.io import show

        def select_params(trace, points, selector):
            # 提取点击的坐标
            x = points.xs[0]
            y = points.ys[0]
            print(f"点击坐标:x={x}, y={y}")

        fig = px.line(x=[1,2, 3], y=[1, 2, 3]) 
        # 给trace绑定点击事件
        fig.data[0].on_click(select_params)
        # 渲染到指定div
        show(fig, config={"responsive": True}, include_plotlyjs="cdn", div_id="chart1")
    </py-script>
</body>
</html>

说明:plotly.io.show支持直接将Python端的图表对象渲染到指定的div,此时Python端绑定的on_click事件可以正常触发,points参数包含点击点的x、y数组(取第一个元素即可获取单次点击的坐标)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:04:57