FastAPI:如何在 Web 应用程序中处理 Plotly 图形单击事件?

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

我正在使用 FastAPI 创建一个简单的 Web 应用程序,我想在其中渲染 Plotly 图形并在单击图形时记录 (x, y) 值。我正在导出图表,然后尝试设置点击事件处理程序。

这是我的 FastAPI 代码的相关部分:

    new_html = """
    <div id='divPlotly'></div>
    <script>
        var plotly_data = {}
        Plotly.react('divPlotly', plotly_data.data, plotly_data.layout);
    </script>
    """.format(
    fig.to_json())
    return templates.TemplateResponse(
        "graph.html", {"request": request, "graph_html": new_html}
    )

我还尝试直接导出为 HTML:

graph_html = fig.to_html(full_html=False)
return templates.TemplateResponse(
    "graph.html", {"request": request, "graph_html": graph_html}
)

我的 HTML 文件 (graph.html) 如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Graph</title>
        <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    </head>
    <body>
        <div id="graph-container">
            {{ graph_html | safe }}
        </div>
        <script>
            // Function to initialize Plotly graph click event handler
            function initGraphClickHandler() {
                var graphContainers = document.getElementsByClassName('plot-container plotly');
                console.log(graphContainers);
                if (graphContainers.length > 0) {
                    var graphContainer = graphContainers[0];
                    console.log(graphContainer);
                    graphContainer.on('plotly_click', function(data) {
                        var point = data.points[0];
                        var x = point.x;
                        var y = point.y;
                        var text = `Clicked Point: X=${x}, Y=${y}`;
                        alert(text);
                    });
                }
            }
            document.addEventListener('DOMContentLoaded', initGraphClickHandler);
        </script>
    </body>
    </html>

但是,我在控制台中遇到以下错误:

    TypeError: graphContainer.on is not a function
        at initGraphClickHandler (visualize:88:36)
        at Object.success (visualize:49:25)
        at c (jquery-3.6.0.min.js:2:28327)
        at Object.fireWith [as resolveWith] (jquery-3.6.0.min.js:2:29072)
        at l (jquery-3.6.0.min.js:2:79901)
        at XMLHttpRequest.<anonymous> (jquery-3.6.0.min.js:2:82355)

我尝试过的:

将图表导出为 JSON,然后使用 Plotly.react。 使用fig.to_html直接将图表导出为HTML。 使用访问图形容器和设置事件侦听器的不同变体。 问题: 错误 TypeError: graphContainer.on is not a function 表明 graphContainer 元素没有 .on 方法。我不确定我是否访问了正确的元素,或者我初始化 Plotly 的方式是否存在问题。

问题: 如何在此 FastAPI 应用程序中为我的 Plotly 图表正确设置单击事件处理程序?任何帮助或建议将不胜感激。谢谢!

javascript python plotly fastapi plotly.js
1个回答
0
投票

问题是,当

DOMContentLoaded
事件触发时,图形 div 仍未处理(并且当
on
运行时,
initGraphClickHandler()
方法尚未在 DOM 对象上注册)。

幸运的是,

Plotly.react()
返回一个在图形div“就绪”时解析的承诺,因此您可以使用
plotly_click
在适当的时候添加
then()
处理程序(即直接在代码的FastAPI部分中):

Plotly.react(...).then(gd => gd.on('plotly_click', clickHandler);
© www.soinside.com 2019 - 2024. All rights reserved.