使用 @visx/hierarchy 在 React 中可视化树形与层次数据:五大布局组件实战指南
使用 visx/hierarchy 在 React 中可视化树形与层次数据五大布局组件实战指南【免费下载链接】visx visx | visualization components项目地址: https://gitcode.com/gh_mirrors/vi/visx导读visx/hierarchy是 visx 体系中专门面向**层次数据hierarchical data**的可视化子包为 React 提供了一组开箱即用的布局组件整体设计与d3-hierarchy保持一一对应。本指南将以 packages/visx-hierarchy/Readme.md 为核心骨架结合仓库源码深入讲解如何用hierarchy()构造 d3 格式的根节点、五种布局Tree / Cluster / Pack / Partition / Treemap各自的适用场景与完整 props以及如何通过渲染回调render prop和自定义节点/连线组件实现完全可控的层次可视化。读完本文你可以直接在自己的 React 项目中搭建树图、圈图、旭日图和矩形树图。为什么需要层次数据组件许多真实数据集天然具有层级结构文件系统目录、公司组织架构、商品类目树、基因谱系、词云词频嵌套……在 React 生态中处理这类数据通常面临两个问题布局算法复杂树、集群、打包、分区、矩形树都有各自的几何布局规则手写成本高与渲染解耦困难布局结果需要转成 SVG 元素并且要支持样式定制。visx/hierarchy的解决方案是用d3-hierarchy完成布局计算用 React 组件负责渲染。所有组件接收同一个d3-hierarchy定义的根节点root node作为输入因此你在不同布局之间切换时数据层完全无需改动。从 src/index.ts 可以看到包对外同时导出五类能力五种布局组件Tree、Cluster、Pack、Partition、Treemap三个默认渲染组件HierarchyDefaultLink、HierarchyDefaultNode、HierarchyDefaultRectNoded3-hierarchy 的布局与工具函数再导出hierarchy、stratify、以及treemapSquarify、treemapBinary、treemapResquarify、treemapDice、treemapSlice、treemapSliceDice六种 treemap 平铺算法完整的类型再导出见 src/types.tsHierarchyNode、HierarchyPointNode、HierarchyCircularNode、HierarchyRectangularNode、HierarchyPointLink、HierarchyCircularLink、HierarchyRectangularLink、HierarchyLink以及自定义平铺方法类型TileMethodDatum。// equivalent to import { hierarchy } from d3-hierarchy; import { hierarchy } from visx/hierarchy;安装与依赖npm install --save visx/hierarchy根据 package.jsonvisx/hierarchy的运行时依赖非常克制d3-hierarchy^1.1.4布局计算引擎visx/group提供Group容器用于整体位移top/left偏移classnames合并 classNametypes/d3-hierarchyTypeScript 类型支持。其 peerDependencies 为react^18 || ^19并声明了 ESM/CJS 双入口exports字段分别指向esm/index.js与lib/index.js支持 tree-shaking。第一步构造层级根节点所有布局组件都接收一个root: HierarchyNodeDatum属性——这与d3-hierarchy模块定义的根节点格式完全一致。因此第一步是把普通 JS 对象转换成 d3 层级结构import { hierarchy } from visx/hierarchy; const root hierarchy({ name: root, children: [ { name: child #1 }, { name: child #2, children: [{ name: grandchild #1 }, { name: grandchild #2 }, { name: grandchild #3 }], }, ], });转换后的root是HierarchyNodeDatum实例携带depth、height、parent、children、descendants()、links()等方法可以直接传给任意布局组件。hierarchy默认从每个节点的children属性读取子节点并可以通过第二个参数自定义 accessorconst root hierarchy(data, (d) d.subItems);此外包还再导出了stratify适合把扁平记录如{ id, parentId }列表组装成层级结构例如数据库中的目录表或 CSV 导入的组织数据。五种布局组件适用场景与完整 Props五种布局组件在 API 设计上高度一致都接收root、top、left、className都支持children渲染回调覆盖默认输出也都允许通过nodeComponent/linkComponent注入自定义渲染组件。下面逐一展开。Tree经典树状图Tree对应d3-hierarchy的tree()布局将树节点按“兄弟在同一水平层、叶子平铺”的方式排列是最常用的目录树 / 组织架构图布局。核心 propssrc/hierarchies/Tree.tsxProp类型说明rootHierarchyNodeDatum必填d3 层级根节点size[number, number]布局尺寸[width, height]。坐标系统是任意的例如径向布局可传[360, radius]表示 360° 广度、radius 深度nodeSize[number, number]每个节点的固定尺寸[width, height]设置后根节点固定在⟨0, 0⟩separation(a, b) number相邻节点分离度 accessor控制兄弟/表亲节点间距linkComponent/nodeComponentReact 组件自定义连线/节点渲染children(node) ReactNode渲染回调接收布局结果HierarchyPointNodeDatumtop/leftnumber整体位移作用于外层GroupclassNamestring追加到外层Group的 class默认带visx-tree最简单的用法是让组件用默认节点与连线完成渲染import { Tree, hierarchy } from visx/hierarchy; const data hierarchy({ name: root, children: [{ name: a }, { name: b }] }); export default function SimpleTree() { return ( svg width{500} height{300} Tree top{20} left{20} size{[460, 260]} root{data} / /svg ); }Cluster集群图叶节点等距Cluster对应d3-hierarchy的cluster()布局。它与Tree的区别在于所有叶节点被等距排布在底层父节点居于子节点正中非常适合表现具有明显层级且叶子数量可观的“谱系/聚类”结构。其 props 与Tree几乎一致src/hierarchies/Cluster.tsxsize、nodeSize、separation、linkComponent、nodeComponent、children、top、left、className。源码中有一处细节值得注意Tree用if (nodeSize)判断是否设置nodeSize而Cluster使用if (nodeSize ! undefined)允许显式传入[0, 0]这类假值场景细节处理上更严谨。Pack圆形打包图气泡图Pack对应d3-hierarchy的pack()布局用大小不一的圆表示节点通过圆面积体现数值大小适合展示“部分与整体”的占比关系。核心 propssrc/hierarchies/Pack.tsxProp类型说明radius(node) number叶子圆半径 accessor若不传半径由叶子节点的value推导并按布局size等比缩放size[number, number]布局尺寸[width, height]paddingnumber节点间的近似间距nodeComponentReact 组件自定义节点渲染节点为HierarchyCircularNode含x、y、r注意Pack的输出节点是HierarchyCircularNode类型默认节点组件HierarchyDefaultNode恰好兼容它读取node.x、node.y、node.r渲染一个circle见 HierarchyDefaultNode.tsx默认半径 15、填充色#21D4FD。因此Pack与Tree/Cluster可共用同一个默认节点组件。Partition分区图旭日图 / 冰柱图Partition对应d3-hierarchy的partition()布局把节点空间按 value 递归切分为矩形切片横向或纵向堆叠是**旭日图Sunburst和冰柱图Icicle**的底层布局。核心 propssrc/hierarchies/Partition.tsxProp类型说明size[number, number]布局尺寸roundboolean是否对坐标取整避免亚像素渲染模糊paddingnumber相邻子节点之间的间隔nodeComponentReact 组件自定义节点渲染节点为HierarchyRectangularNode含x0/x1/y0/y1Partition默认使用HierarchyDefaultRectNodeHierarchyDefaultRectNode.tsx它从节点的x0、x1、y0、y1计算width、height并渲染rect。若需要旭日图效果只需把size设为极坐标语义的[2 * Math.PI, radius]再把矩形节点替换为弧形渲染即可。Treemap矩形树图Treemap对应d3-hierarchy的treemap()布局将矩形区域按 value 递归切块是磁盘占用分析、商品销售结构等场景的标准选择也是本包中props 最丰富的组件src/hierarchies/Treemap.tsxProp类型说明tileTileMethodDatum平铺算法包内置再导出treemapSquarify默认、treemapBinary、treemapResquarify、treemapDice、treemapSlice、treemapSliceDice六种size[number, number]布局尺寸roundboolean是否取整坐标paddingnumber \| accessor同时设置内、外 paddingpaddingInnernumber \| accessor相邻子节点间距paddingOuternumber \| accessor节点与其子节点的间距paddingTop/paddingRight/paddingBottom/paddingLeftnumber \| accessor四个方向单独控制的边距nodeComponentReact 组件自定义节点渲染HierarchyRectangularNode实现上Treemap.tsx#L73-L83padding系列参数统一经由 utils/setNumOrNumAccessor.ts 处理无论你传一个数字还是返回数字的 accessor 函数都会正确绑定到 d3 treemap 布局上。这意味着你完全可以按节点属性如node.depth或node.value动态决定边距import { Treemap, hierarchy, treemapSquarify } from visx/hierarchy; const root hierarchy(data).sum((d) d.value); Treemap root{root} tile{treemapSquarify} size{[500, 300]} round paddingInner{2} paddingOuter{4} nodeComponent{({ node }) ( rect x{node.x0} y{node.y0} width{node.x1 - node.x0} height{node.y1 - node.y0} fill{node.depth 0 ? #21D4FD : #b6fbff} stroke#fff / )} /;注意这里调用了root.sum((d) d.value)——sum()是 treemap、pack、partition 布局计算数值的前置步骤它把每个节点的value汇总到祖先节点布局算法正是依据这些 value 分配面积。这也是HierarchyNode与普通对象最大的差异点之一。渲染回调children与自定义组件五种布局组件都支持两条渲染路径源码结构完全一致const data layout(root); if (children) return {children(data)}/; // 渲染回调优先 return ( Group top{top} left{left} className{cx(visx-tree, className)} {/* 默认遍历 links() 与 descendants() 渲染 */} /Group );以 Tree.tsx#L68-L87 为例。渲染回调模式传入children后组件只负责计算布局把HierarchyPointNode或HierarchyCircularNode/HierarchyRectangularNode交给你自由渲染。这是构建交互式、动画化、异形节点图表的首选方式典型用法如径向树图Tree root{root} size{[2 * Math.PI, 400]} {(tree) ( Group {tree.links().map((link, i) ( path key{i} d{M${link.source.x},${link.source.y} A... } // 用弧线连接父子 fillnone stroke#999 / ))} {tree.descendants().map((node, i) ( circle key{i} cx{node.x} cy{node.y} r{node.depth 0 ? 8 : 4} fill#21D4FD / ))} /Group )} /Tree默认渲染模式不传children时组件遍历data.links()与data.descendants()用linkComponent与nodeComponent逐个渲染。三个默认组件可直接复用或作为自定义组件的起点HierarchyDefaultLinkHierarchyDefaultLink.tsx渲染一条linestrokeWidth2、stroke#999、strokeOpacity0.6HierarchyDefaultNode渲染circler15、fill#21D4FD兼容x/y/r与x/y两种节点结构HierarchyDefaultRectNode渲染rect由x0/x1/y0/y1计算宽高。所有默认渲染都包在visx/group的Group中且每种布局有独立的 className 前缀visx-tree、visx-cluster、visx-pack、visx-partition、visx-treemap便于全局样式覆盖。小结从数据到图表的四步路径综合以上内容用visx/hierarchy做层次可视化的固定套路可以归纳为四步构造层级用hierarchy(data)或stratify(rows)把原始数据变成HierarchyNode汇总数值仅面积类布局需要调用.sum((d) d.value)让祖先节点累加 value选择布局树状结构用Tree/Cluster面积占比用Pack/Partition/Treemap并通过size、padding、tile等 props 调参定制渲染要么用默认节点/连线组件快速出图要么用children渲染回调完全掌控输出配合自定义组件实现径向树、旭日图等高级形态。仓库配套的测试如 test/Tree.test.tsx、test/Cluster.test.tsx、test/Defaults.test.tsx覆盖了布局坐标、默认组件渲染与节点/连线计数等行为可作为你自定义实现时的行为参考。此外visx-demo包的 sandboxes 目录中有各布局的完整可运行示例packages/visx-demo/src/sandboxes 下的 tree、treemap、pack、partition 等示例可直接对照学习。由于布局完全依赖d3-hierarchy的确定性算法同一份root在不同布局间切换时数据层零改动——这也是本包“以文档规定的 d3 根节点为唯一数据契约”设计理念的最大红利。【免费下载链接】visx visx | visualization components项目地址: https://gitcode.com/gh_mirrors/vi/visx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

public-apis:开源API基础设施地图与工程化使用指南

public-apis:开源API基础设施地图与工程化使用指南

1. 项目概述:这不是一份“API列表”,而是一份活的行业基础设施地图你有没有遇到过这样的场景:刚写完一个天气预报小工具,想加个实时空气质量数据,结果在搜索引擎里翻了二十页,点开三个链接都提示“API已下线…

2026/9/22 23:15:27 阅读更多 →
AI辅助智慧厂房3D大屏开发:从需求拆解到数据闭环的实战复盘

AI辅助智慧厂房3D大屏开发:从需求拆解到数据闭环的实战复盘

干智慧厂房大屏这行的朋友应该都有体会:需求方一开始说的“搞个3D大屏”,背后往往藏着一条从现场设备到数据中台、再到可视化渲染的超长链路。我这次接到的项目也是一样,最开始只有一句“把厂房做成3D的,数据要实时”,…

2026/9/22 13:30:08 阅读更多 →
ArchiveBox `archivebox init` 命令完全解析:初始化、升级与源码级工作流

ArchiveBox `archivebox init` 命令完全解析:初始化、升级与源码级工作流

后端数据工程 【免费下载链接】ArchiveBox 🗃 Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more... 项目地址: https://gitcode.com/gh_mirrors/ar/ArchiveB…

2026/9/22 15:30:40 阅读更多 →

最新新闻

在 EOSIO 中使用 `cleos wallet import` 导入密钥对:完整操作指南与源码原理剖析

在 EOSIO 中使用 `cleos wallet import` 导入密钥对:完整操作指南与源码原理剖析

区块链 【免费下载链接】eos An open source smart contract platform 项目地址: https://gitcode.com/gh_mirrors/eo/eos 点击查看 免费下载 本篇指南聚焦 EOSIO 智能合约平台(当前仓库 eo/eos)中最常用的密钥管理操作——使用 cleos wall…

2026/9/23 21:28:23 阅读更多 →
GAN行人重识别:用特征空间对齐提升跨摄像头匹配精度

GAN行人重识别:用特征空间对齐提升跨摄像头匹配精度

简介:本资源是一套完整的基于生成对抗网络(GAN)的行人重识别毕业设计实现方案,面向深度学习初学者与计算机视觉方向本科生,聚焦跨摄像头场景下的身份匹配问题,适用于课程设计、毕设开发与算法复现学习。压缩…

2026/9/23 21:28:23 阅读更多 →
Akka Streams StreamConverters.asJavaStream 详解:将 Akka Sink 物化为 Java 8 Stream 的桥接之道

Akka Streams StreamConverters.asJavaStream 详解:将 Akka Sink 物化为 Java 8 Stream 的桥接之道

后端并发编程异步编程 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mirrors/ak/akka-core 点击查看 免费下载 Akka Stream…

2026/9/23 21:28:23 阅读更多 →
【有源码】基于Hadoop+Spark的红白葡萄酒品质数据可视化分析平台-基于机器学习与数据挖掘的葡萄酒品质分析与可视化系统

【有源码】基于Hadoop+Spark的红白葡萄酒品质数据可视化分析平台-基于机器学习与数据挖掘的葡萄酒品质分析与可视化系统

注意:该项目只展示部分功能,如需了解,文末咨询即可。 本文目录1 开发环境2 系统设计3 系统展示3.1 大屏页面3.2 分析页面3.3 基础页面4 更多推荐5 部分功能代码1 开发环境 发语言:python 采用技术:Spark、Hadoop、Dja…

2026/9/23 21:28:23 阅读更多 →
基于Python的人脸识别系统毕设源码详解:从环境搭建到算法调优

基于Python的人脸识别系统毕设源码详解:从环境搭建到算法调优

简介:面向本科毕业设计及课程设计场景的人脸识别系统项目,基于Python实现,提供完整可运行的源码、毕业论文文档及配套说明。代码内含详细注释,结构清晰,新手也能快速理解关键逻辑;作者自述为98分高分项目&a…

2026/9/23 21:28:23 阅读更多 →
okbiye AI答辩PPT:功能与作用全解析

okbiye AI答辩PPT:功能与作用全解析

答辩是毕设的最后一道关,很多同学论文写得很好,却栽在了答辩PPT上:答辩前才开始做PPT,一页一页做了一周还是做不好,内容不知道怎么提炼,排版不专业,配色辣眼睛;讲稿写不好&#xff0…

2026/9/23 21:27:23 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →