
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 定位 + 数据预排序 + 样式隔离,完全可构建出专业、可控、视觉对齐的分栏树图。该方案已在生产环境验证,兼顾灵活性与渲染稳定性,是当前最实用的落地解法。