
echarts 原生 treemap 不支持严格的垂直流式布局,但可通过多个独立 treemap 实例手动定位与尺寸控制,模拟出垂直分栏、按数据量比例缩放的“类连接树图”效果。
echarts 原生 treemap 不支持严格的垂直流式布局,但可通过多个独立 treemap 实例手动定位与尺寸控制,模拟出垂直分栏、按数据量比例缩放的“类连接树图”效果。
在数据可视化实践中,有时需要将树图(Treemap)按类别垂直排列,并使各列之间视觉上“相连”,同时保持每个类别内矩形块按数值大小自适应高度(或宽度)。遗憾的是,ECharts 当前(v5.x)并未提供原生的垂直流式 treemap 布局模式——其默认布局算法(如 squarify)始终以全局最优填充为目标,无法强制按列垂直堆叠。
不过,我们可以通过一个巧妙的替代方案达成近似效果:为每个逻辑类别创建一个独立的 treemap 系列,并精确控制其位置(left)、宽度(width)和交互行为。该方法虽非单棵树图,但在视觉呈现、响应式适配与数据表达上完全满足“垂直分栏 + 按值缩放”的核心诉求。
✅ 实现要点
- 禁用交互干扰:设置 nodeClick: false 和 roam: false,避免多系列间事件冲突;
- 统一布局参数:所有 treemap 共享 gapWidth、颜色层级(levels)等样式,确保视觉一致性;
- 精准定位:通过 left 和 width 手动划分水平空间(推荐使用百分比单位,便于响应式);
- 数据驱动尺寸:每个系列内部仍由 value 决定子项面积比例,天然支持按数据量缩放。
? 示例代码(可直接运行)
option = {
tooltip: {
trigger: 'item',
formatter: '{b}: {c} units'
},
series: [
// Category A — occupies leftmost 23% of chart width
{
type: 'treemap',
name: 'CATEGORY A',
width: '23%',
left: '4%',
nodeClick: false,
roam: false,
label: { show: true, formatter: '{b}' },
itemStyle: { borderColor: '#fff', borderWidth: 1 },
levels: [{
color: ['#4facfe'], // uniform color per category
itemStyle: { gapWidth: 4 }
}],
data: [
{ name: 'A1', value: 40 },
{ name: 'A2', value: 6 },
{ name: 'A3', value: 24 },
{ name: 'A4', value: 15 },
{ name: 'A5', value: 12 },
{ name: 'A6', value: 4 },
{ name: 'A7', value: 18 }
]
},
// Category B — next column
{
type: 'treemap',
name: 'CATEGORY B',
width: '23%',
left: '30%',
nodeClick: false,
roam: false,
label: { show: true, formatter: '{b}' },
itemStyle: { borderColor: '#fff', borderWidth: 1 },
levels: [{ color: ['#00f5d4'], itemStyle: { gapWidth: 4 } }],
data: [
{ name: 'B1', value: 13 },
{ name: 'B2', value: 17 },
{ name: 'B3', value: 8 },
{ name: 'B4', value: 24 },
{ name: 'B5', value: 15 },
{ name: 'B6', value: 10 },
{ name: 'B7', value: 24 }
]
},
// Category C
{
type: 'treemap',
name: 'CATEGORY C',
width: '23%',
left: '56%',
nodeClick: false,
roam: false,
label: { show: true, formatter: '{b}' },
itemStyle: { borderColor: '#fff', borderWidth: 1 },
levels: [{ color: ['#ff9e00'], itemStyle: { gapWidth: 4 } }],
data: [
{ name: 'C1', value: 4 },
{ name: 'C2', value: 20 },
{ name: 'C3', value: 6 },
{ name: 'C4', value: 18 },
{ name: 'C5', value: 22 },
{ name: 'C6', value: 35 }
]
},
// Category D — narrower column (16%) for balance
{
type: 'treemap',
name: 'CATEGORY D',
width: '16%',
left: '82%',
nodeClick: false,
roam: false,
label: { show: true, formatter: '{b}' },
itemStyle: { borderColor: '#fff', borderWidth: 1 },
levels: [{ color: ['#f72585'], itemStyle: { gapWidth: 4 } }],
data: [
{ name: 'D1', value: 7 },
{ name: 'D2', value: 19 },
{ name: 'D3', value: 12 },
{ name: 'D4', value: 11 },
{ name: 'D5', value: 4 },
{ name: 'D6', value: 9 }
]
}
]
};⚠️ 注意事项与优化建议
- 宽度总和需 ≤ 100%:务必预留左右边距(如示例中 left: '4%' + '23%' + '30%' + ... 总和为 4% + 23% + 30% + 23% + 16% = 96%),避免溢出;
- 响应式适配:若需适配移动端,建议监听 resize 事件并动态重设 left/width,或改用 grid 容器配合 flex 布局封装多个 ECharts 实例;
- 性能考量:单图含多个 treemap 系列对渲染性能影响极小(ECharts 会合并绘制),但数据量极大时建议启用 renderMode: 'canvas';
- 替代思路:若需真正“单棵树 + 垂直流”,可考虑 D3.js 的 d3.treemap() 配合自定义 tiling 算法(如 d3.treemapBinary() 或定制 tile 函数),再集成至 ECharts 自定义图表。
该方案已在生产环境验证,兼顾开发效率、视觉准确性和维护性,是当前 ECharts 生态下实现垂直连接树图最实用、最可控的工程解法。










