ECharts 实现垂直排列且横向连接的树状图(Treemap)教程

1次阅读

ECharts 实现垂直排列且横向连接的树状图(Treemap)教程

echarts 原生 treemap 不支持严格的垂直布局与跨系列连接,但可通过多个独立 treemap 实例手动定位、等宽缩放与视觉对齐,模拟出垂直分栏、自上而下排列、横向并列的“类连接树图”效果。

echarts 原生 treemap 不支持严格的垂直布局与跨系列连接,但可通过多个独立 treemap 实例手动定位、等宽缩放与视觉对齐,模拟出垂直分栏、自上而下排列、横向并列的“类连接树图”效果。

在数据可视化实践中,有时需要将不同分类(如部门、产品线、时间周期)以垂直分栏形式并排展示,每栏内部按数值大小自上而下垂直叠(即“纵向 treemap”),且各栏之间视觉连贯、宽度协调、高度对齐——这种布局常被称作“垂直连接树图”(vertically connected treemap)。遗憾的是,ECharts 的 series-treemap 类型不提供原生的垂直排序方向控制或跨 series 的布局联动能力;其 squareRatio 参数仅影响单个 treemap 内部矩形的宽高倾向,无法强制整体垂直流式排列,也无法实现多系列间的坐标级对齐。

因此,实现该效果的核心思路是:放弃单 treemap 多层级嵌套,转为多个独立 treemap 实例,并通过精确的 left/width/height 控制位置与比例,配合统一的 levels 配置和视觉设计,达成视觉上的垂直分栏与逻辑连接感

✅ 推荐实现方案:多 Treemap 并排 + 手动定位

以下是一个生产就绪的配置示例,包含 4 个垂直栏目(CATEGORY A–D),每个栏目独立渲染、宽度可控、禁用交互干扰(nodeClick: false, roam: false),并使用一致的 gapWidth 和单色配色增强纵向节奏感:

option = {   tooltip: {     trigger: 'item',     formatter: '{b}: {c} KB'   },   series: [     // CATEGORY A — 左起第1栏(4% 开始,宽23%)     {       type: 'treemap',       name: 'CATEGORY A',       width: '23%',       left: '4%',       height: '80%',        // 统一高度,便于纵向对齐       top: '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: 6},         {name: 'A3', value: 24},         {name: 'A4', value: 15},         {name: 'A5', value: 12},         {name: 'A6', value: 4},         {name: 'A7', value: 18}       ]     },      // CATEGORY B — 第2栏(30% 开始,宽23%)     {       type: 'treemap',       name: 'CATEGORY B',       width: '23%',       left: '30%',       height: '80%',       top: '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: 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 — 第3栏(56% 开始,宽23%)     {       type: 'treemap',       name: 'CATEGORY C',       width: '23%',       left: '56%',       height: '80%',       top: '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: 4},         {name: 'C2', value: 20},         {name: 'C3', value: 6},         {name: 'C4', value: 18},         {name: 'C5', value: 22},         {name: 'C6', value: 35}       ]     },      // CATEGORY D — 第4栏(82% 开始,宽16%,留白适配)     {       type: 'treemap',       name: 'CATEGORY D',       width: '16%',       left: '82%',       height: '80%',       top: '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: 7},         {name: 'D2', value: 19},         {name: 'D3', value: 12},         {name: 'D4', value: 11},         {name: 'D5', value: 4},         {name: 'D6', value: 9}       ]     }   ] };

⚠️ 关键注意事项

  • 宽度总和需 ≤ 100%:示例中 4% + 23% + 30% + 23% + 56% + 23% + 82% + 16% 是 left 与 width 的叠加逻辑,实际占用为 23% + 23% + 23% + 16% = 85%,剩余 15% 作为栏间/边缘留白,确保响应式安全;
  • 高度与 top 对齐至关重要:所有 treemap 设置相同 height 和 top,才能保证各栏顶部基准线一致,形成真正的“垂直连接”视觉;
  • 禁用交互提升体验:nodeClick: false 和 roam: false 可避免用户误操作导致视图错乱,尤其当多 treemap 紧邻时;
  • 色彩与间距统一增强连贯性:各栏 gapWidth 保持一致(如 4),颜色选用同色系不同明度,强化纵向阅读流;
  • 数据量差异大时建议归一化或限制最小值:若某栏数据极小(如全部

✅ 总结

虽然 ECharts 尚未内置垂直 treemap 布局引擎,但通过「多 series + 精确盒模型控制 + 视觉一致性设计」的组合策略,完全可复现专业级垂直连接树图。该方法稳定、兼容性好(支持所有 ECharts 5+ 版本)、易于维护,且能灵活适配动态数据源——只需将原始分类数据按组拆分,注入对应 series 即可。对于追求更高定制化的场景,亦可结合 graphic 组件绘制连接线或标注,进一步强化“连接”语义。

text=ZqhQzanResources