如何使用 Highcharts 构建两级下钻式树状图(Treemap)

轻伟姑娘_8011

轻伟姑娘_8011

2026-09-12

311人浏览

原创

如何使用 Highcharts 构建两级下钻式树状图(Treemap)

本文详解如何基于 highcharts 的 treemap 图表类型,将嵌套的 json 数据(如多层级办公室与员工结构)正确转换为支持两级下钻的可视化图表,并提供可运行的 javascript 数据处理逻辑与完整配置示例。

本文详解如何基于 highcharts 的 treemap 图表类型,将嵌套的 json 数据(如多层级办公室与员工结构)正确转换为支持两级下钻的可视化图表,并提供可运行的 javascript 数据处理逻辑与完整配置示例。

Highcharts 的 treemap 图表天然支持层级钻取(drilldown),但前提是数据必须严格遵循其要求的扁平化结构:每个节点需显式声明 id(父级)或 parent(子级),且所有节点统一置于 data 数组中。原始代码中存在多个关键问题:变量未声明(如 points、officeI 未初始化)、循环逻辑混乱(误用 country/cause 等未定义变量)、JSON 结构解析错误(如尝试遍历 data[office][country],但实际数据中无 country 字段),导致图表无法渲染。

✅ 正确的数据建模逻辑

根据你提供的 JSON 响应结构:

{
  "Austin": {
    "Balance": "12345.12",
    "RM": {
      "Matt": {"Balance": "12345.12"},
      "John": {"Balance": "12345.12"}
    }
  }
}

这是一个典型的两级结构:

绘蛙AI视频
绘蛙AI视频

绘蛙AI视频是一款面向电商营销的图片转视频和模特动态视频生成工具。

下载
  • Level 1(办公室):Austin、ElPaso、ABL → 作为根节点,需设置 id 和 value;
  • Level 2(客户经理 RM):Matt、Brenda、BrianABL 等 → 作为子节点,需设置 parent: 'id_X' 和 value。

以下为健壮、可复用的数据转换代码(已修复作用域、类型转换和结构映射):

$.getJSON('/getdata', function(data) {
    const points = []; // 必须提前声明
    const colors = Highcharts.getOptions().colors;

    // 遍历每个办公室(第一层)
    Object.keys(data).forEach((officeName, index) => {
        const officeData = data[officeName];
        const officeId = `office-${index}`;
        const officeValue = parseFloat(officeData.Balance) || 0;

        // 添加办公室节点(父节点)
        points.push({
            name: officeName,
            value: officeValue,
            id: officeId,
            color: colors[index % colors.length],
            tooltip: { pointFormat: `<b>{point.name}</b>: ${officeValue.toLocaleString()} USD` }
        });

        // 添加下属 RM 节点(子节点)
        const rmData = officeData.RM || {};
        Object.keys(rmData).forEach((rmName, rmIndex) => {
            const rmValue = parseFloat(rmData[rmName].Balance) || 0;
            points.push({
                name: rmName,
                value: rmValue,
                parent: officeId,
                color: colors[index % colors.length], // 继承父级色调增强视觉关联
                tooltip: { pointFormat: `<b>{point.name}</b> (under ${officeName}): ${rmValue.toLocaleString()} USD` }
            });
        });
    });

    // 渲染 Highcharts treemap
    Highcharts.chart('container', {
        chart: {
            height: 600,
            backgroundColor: '#f9f9f9'
        },
        title: {
            text: 'Office & RM Balance Distribution',
            align: 'left'
        },
        subtitle: {
            text: 'Click on any office to drill down to its Relationship Managers',
            align: 'left'
        },
        series: [{
            type: 'treemap',
            layoutAlgorithm: 'squarified',
            allowDrillToNode: true, // 启用下钻
            animationLimit: 1000,
            dataLabels: {
                enabled: true,
                format: '{point.name}<br><b>{point.value:.2f}</b>',
                style: { color: '#333', fontSize: '12px', textOutline: 'none' }
            },
            levelIsConstant: false,
            levels: [{
                level: 1,
                dataLabels: { enabled: true, style: { fontWeight: 'bold' } }
            }, {
                level: 2,
                dataLabels: { enabled: true }
            }],
            data: points
        }],
        tooltip: {
            useHTML: true,
            headerFormat: '',
            pointFormat: '{point.tooltip.pointFormat}'
        },
        plotOptions: {
            treemap: {
                borderColor: '#ffffff',
                borderWidth: 1
            }
        }
    });
});

⚠️ 关键注意事项

  • 数据类型安全:务必使用 parseFloat() 将字符串 "12345.12" 转为数字,否则 Highcharts 会忽略非数值 value;
  • ID 命名唯一性:office-${index} 确保每个办公室 ID 全局唯一,避免父子关系错乱;
  • 颜色一致性:子节点复用父节点颜色(colors[index % colors.length]),直观体现归属关系;
  • 响应式容错:添加 || {} 和 || 0 处理可能缺失的 RM 或 Balance 字段,提升鲁棒性;
  • Go 后端优化建议:当前 Go 结构体嵌套过深,建议改用更扁平的 slice-based 结构(如 []Office{} + []RM{}),便于前端映射,也利于未来扩展第三级(如 RM 下的客户列表)。

✅ 验证与调试技巧

  1. 在 $.getJSON 回调内 console.log(points),确认生成的数组符合 Highcharts 文档要求的格式;
  2. 使用浏览器开发者工具 Network 标签页,检查 /getdata 返回的 JSON 是否合法(无额外逗号、编码正确);
  3. 若下钻失效,检查控制台是否报错 Uncaught Error: Invalid node id —— 通常因 parent 值与任一节点 id 不匹配所致。

通过以上结构化处理,即可稳定渲染两级可交互 treemap 图表,满足业务中“办公室 → 客户经理”维度的下钻分析需求。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

highcharts

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

430

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

473

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

243

6

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

60

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

20

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

20

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

20

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Highcharts中文参考手册
Highcharts中文参考手册

共16课时 | 12.7万人学习