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

Plotly treemap点击子容器时弹出完整hover data弹窗需求

实现Plotly Treemap点击子容器弹窗展示完整Hover数据

核心思路

通过监听Plotly Treemap的点击事件,获取点击节点的自定义数据(custom_data)或悬停数据,将其格式化为可读文本后,用浏览器原生的alert弹窗展示。


方法1:Python Dash环境下实现

如果你的代码基于Dash框架,可通过客户端回调直接编写JS逻辑实现:

import dash
from dash import dcc, html, Input, Output, clientside_callback
import plotly.express as px
import pandas as pd

# 示例数据集(替换为你的实际数据)
df = px.data.tips()

# 构建Treemap,配置hover_data和custom_data
fig = px.treemap(
    df,
    path=['day', 'time', 'sex'],
    values='total_bill',
    hover_data=['tip', 'size'],  # 悬停时显示的字段
    custom_data=['tip', 'size', 'total_bill']  # 存储完整数据用于点击事件
)

app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Graph(id='treemap', figure=fig)
])

# 客户端回调:监听点击事件并弹出弹窗
clientside_callback(
    """
    function(clickData) {
        if (!clickData) return '';
        const point = clickData.points[0];
        // 从custom_data提取完整数据,拼接为可读文本
        const content = [
            `类别路径: ${point.id}`,
            `总账单: ${point.customdata[2]}`,
            `小费: ${point.customdata[0]}`,
            `人数: ${point.customdata[1]}`
        ].join('\\n');
        alert(content);
        return '';
    }
    """,
    Output('treemap', 'id'),  # 无实际输出,仅触发回调
    Input('treemap', 'clickData')
)

if __name__ == '__main__':
    app.run_server(debug=True)

代码说明

  • 使用clientside_callback直接执行JS代码,避免服务器端交互,响应更快
  • 从clickData中获取点击节点的custom_data(原始数据数组),比解析hovertext更稳定
  • 按需调整字段列表和文本格式,适配你的实际数据结构

方法2:纯HTML/JavaScript环境(导出图表后)

如果是将Plotly图表导出为HTML文件,可直接添加事件监听代码:

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
</head>
<body>
    <div id="treemap-container"></div>

    <script>
        // 示例数据(替换为你的实际数据)
        const dataset = {
            day: ['Sun', 'Sun', 'Sat', 'Sat'],
            time: ['Dinner', 'Dinner', 'Dinner', 'Lunch'],
            sex: ['Male', 'Female', 'Male', 'Female'],
            total_bill: [44.3, 35.26, 29.03, 27.18],
            tip: [9, 5, 3.12, 2],
            size: [4, 3, 3, 2]
        };

        // 构建Treemap
        const treemapFig = Plotly.express.treemap(dataset, {
            path: ['day', 'time', 'sex'],
            values: 'total_bill',
            hover_data: ['tip', 'size'],
            custom_data: ['tip', 'size', 'total_bill']
        });

        // 渲染图表到容器
        Plotly.newPlot('treemap-container', treemapFig.data, treemapFig.layout);

        // 监听点击事件
        document.getElementById('treemap-container').on('plotly_click', function(eventData) {
            const clickedPoint = eventData.points[0];
            // 格式化数据文本
            const alertText = [
                `类别路径: ${clickedPoint.id}`,
                `总账单: ${clickedPoint.customdata[2]}`,
                `小费: ${clickedPoint.customdata[0]}`,
                `人数: ${clickedPoint.customdata[1]}`
            ].join('\n');
            alert(alertText);
        });
    </script>
</body>
</html>

代码说明

  • 通过plotly_click事件监听图表的点击动作
  • 从eventData.points[0]中提取节点的完整数据,确保弹窗内容和悬停数据一致
  • 可根据实际custom_data的字段顺序调整文本拼接逻辑

关键注意事项

  • 优先使用custom_data:hovertext是Plotly格式化后的字符串,提取数据易出错;custom_data存储原始数据,更可靠
  • 灵活调整格式:如果需要更美观的展示,可将换行替换为<br>并使用自定义弹窗(而非原生alert)
  • 适配你的数据:根据实际设置的hover_data和custom_data字段,修改文本拼接的内容和顺序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:45:26