ECharts 实现垂直排列且横向对齐的树图(Treemap)布局方案

1次阅读

ECharts 实现垂直排列且横向对齐的树图(Treemap)布局方案

echarts 原生 treemap 不支持严格的垂直流式布局与跨系列对齐,但可通过多 series 手动定位 + 禁用交互的方式模拟出“纵向分栏、按数据大小比例排列”的视觉效果。

echarts 原生 treemap 不支持严格的垂直流式布局与跨系列对齐,但可通过多 series 手动定位 + 禁用交互的方式模拟出“纵向分栏、按数据大小比例排列”的视觉效果。

在数据可视化实践中,有时需要将树图(Treemap)按类别垂直分栏展示——例如每个类别占据一列,内部矩形严格自上而下按数值大小顺序排列,并保持各列顶部对齐、高度一致,形成类似“并排柱状树图”的整齐结构。然而,ECharts 的 series-treemap 类型原生不支持跨 series 的全局排序或垂直流式布局算法;其默认渲染基于 Squarified 算法,目标是优化长宽比,而非对齐或线性排序。

官方文档中虽提供 squareRatio 参数用于微调矩形形状倾向,但实测无法实现稳定垂直叠与跨列对齐。因此,推荐采用多 Treemap series + 精确位置控制的替代方案:

核心思路

  • 每个类别(Category)单独定义一个 series,类型为 ‘treemap’;
  • 通过 left 和 width 手动划分水平空间(如 ‘4%’, ‘23%’, ‘30%’ 等),实现列式布局;
  • 设置 nodeClick: false 和 roam: false 禁用交互,避免拖拽/缩放干扰对齐;
  • 各 series 使用独立 levels 配置颜色与间距,保证视觉一致性;
  • 数据内部顺序即渲染顺序(ECharts 默认按数组索引从上到下排列),因此需预先按 value 降序排序以满足“大块在上”的需求。

以下是可直接运行的完整配置示例(已优化可读性与复用性):

option = {   tooltip: {     trigger: 'item',     formatter: '{b}: {c} units'   },   series: [     // Category A — 左起第一列     {       type: 'treemap',       name: 'CATEGORY A',       width: '23%',       left: '4%',       top: '10%',       bottom: '10%',       nodeClick: false,       roam: false,       label: { show: true, formatter: '{b}' },       itemStyle: { borderColor: '#fff', borderWidth: 1 },       levels: [{         color: ['#4facfe'], // 单色系提升统一感         itemStyle: { gapWidth: 4 }       }],       data: [         { name: 'A1', value: 40 },         { name: 'A2', value: 24 },         { name: 'A3', value: 18 },         { name: 'A4', value: 15 },         { name: 'A5', value: 12 },         { name: 'A6', value: 6 },         { name: 'A7', value: 4 }       ].sort((a, b) => b.value - a.value) // ✅ 关键:显式降序排序     },      // Category B — 第二列     {       type: 'treemap',       name: 'CATEGORY B',       width: '23%',       left: '30%',       top: '10%',       bottom: '10%',       nodeClick: false,       roam: false,       label: { show: true, formatter: '{b}' },       itemStyle: { borderColor: '#fff', borderWidth: 1 },       levels: [{ color: ['#00f5d4'], itemStyle: { gapWidth: 4 } }],       data: [         { name: 'B1', value: 24 },         { name: 'B2', value: 17 },         { name: 'B3', value: 15 },         { name: 'B4', value: 13 },         { name: 'B5', value: 10 },         { name: 'B6', value: 8 },         { name: 'B7', value: 4 }       ].sort((a, b) => b.value - a.value)     },      // Category C — 第三列     {       type: 'treemap',       name: 'CATEGORY C',       width: '23%',       left: '56%',       top: '10%',       bottom: '10%',       nodeClick: false,       roam: false,       label: { show: true, formatter: '{b}' },       itemStyle: { borderColor: '#fff', borderWidth: 1 },       levels: [{ color: ['#ff9e00'], itemStyle: { gapWidth: 4 } }],       data: [         { name: 'C1', value: 35 },         { name: 'C2', value: 22 },         { name: 'C3', value: 20 },         { name: 'C4', value: 18 },         { name: 'C5', value: 6 },         { name: 'C6', value: 4 }       ].sort((a, b) => b.value - a.value)     },      // Category D — 最右列(宽度略窄,适配剩余空间)     {       type: 'treemap',       name: 'CATEGORY D',       width: '16%',       left: '82%',       top: '10%',       bottom: '10%',       nodeClick: false,       roam: false,       label: { show: true, formatter: '{b}' },       itemStyle: { borderColor: '#fff', borderWidth: 1 },       levels: [{ color: ['#f72585'], itemStyle: { gapWidth: 4 } }],       data: [         { name: 'D1', value: 19 },         { name: 'D2', value: 12 },         { name: 'D3', value: 11 },         { name: 'D4', value: 9 },         { name: 'D5', value: 7 },         { name: 'D6', value: 4 }       ].sort((a, b) => b.value - a.value)     }   ] };

? 关键注意事项

  • 空间计算需手动校验:left + width 总和应 ≤ 100%,建议预留 1–2% 间隙防重叠;
  • 响应式适配:若需适配不同屏幕,推荐改用 left: ‘calc(…)’ 或监听 resize 事件动态重设 left/width;
  • 无父子层级时简化配置:本方案适用于扁平化单层数据(即无嵌套 children),若需保留层级,须确保各 series 内部树结构一致且根节点 value 总和相近,否则列高差异明显;
  • 性能考量:每增加一个 series,渲染开销线性上升,建议单页不超过 6 列;
  • 无障碍与导出:该布局下 aria 支持较弱,如需无障碍访问,建议补充 aria-label 或提供表格形式数据摘要。

? 总结:虽然 ECharts 尚未内置垂直 Treemap 布局能力,但通过多 series 定位 + 数据预排序 + 样式隔离,完全可构建出专业、可控、视觉对齐的分栏树图。该方案已在生产环境验证,兼顾灵活性与渲染稳定性,是当前最实用的落地解法。

text=ZqhQzanResources