矩形树图Treemap布局算法深度解析:基于Highcharts实现带层级交互的矩形树图

Treemap |矩形树图

需求

该树状图需要文件modules/treemap.js。 若要与 colorAxis一起使用,还必须包含 modules/heatmap.js。

数据结构

数据的结构是一个 树tree,每个点代表一个节点。每个 节点都可以有自己的子节点。

树会自动在顶部创建一个节点,代表根节点。如果某个点没有定义父节点,或者父节点的ID不存在,父节点将会自动设置为根节点。

以下是Highcharts中树的构建示例:

data:[{name:'I have children',id:'id-1'},{name:'I am a child',parent:'id-1',value:2},{name:'I am a smaller child',parent:'id-1',value:1}]

算法

算法决定点的位置和大小。你使用的算法将会在很大程度上影响图表的外观。Highcharts 树状图提供了四种预设算法。

切片与切割

简单且快速的算法,非常适合组织点。使用“切片与骰子”算法的缺点是节点的长宽比可能变得非常糟糕,从而变得难以比较。这种情况在数据集较大时经常发生。

查看一个切片与切割的示例 example

条纹

这也是一种简单的算法,非常类似于切片与骰子(Slice And Dice)。不同之处在于,它不会在每个节点之间交替方向,而是沿着同一方向绘制所有节点,形成一组列。

查看一个条纹的示例example

方形化

一种旨在为每个点提供较低长宽比的算法。它会逐个将点添加到一条带中,直到找到最佳的长宽比,然后改变方向,用新的带重复相同的过程。这个过程按照相同的模式持续进行,直到所有点都放置在图表中。

查看一个方形化的示例 example .

裁剪

不要误以为这是条纹算法,它在行为上有一些明显的不同。 条纹算法的目标与平方化算法相同,都是为了获得较低的长宽比。这个过程非常相似,但不是交替改变方向,而是将条纹作为列并排绘制。

查看一个条带的示例 example

添加你自己的算法

你是否想使用另一种算法,或者更高级的版本?在Highcharts的树状图中添加新算法是相当简单的任务。具体流程如下:

首先创建包含该算法的函数。该函数有两个参数。第一个参数是一个包含父对象详细信息的对象,第二个参数是一个对象数组,每个对象包含一个子项的详细信息。

父对象传递的变量如下:

  • Number x // 数字 x // 父元素的x位置
  • Number y // 数字 y // 父元素的y位置
  • Number width // 数字 宽度 // 父元素的宽度
  • Number height // 数字 高度 // 父元素的高度
  • String direction // 字符串方向 // 起始方向,可以是垂直或水平,子元素应沿此方向绘制
  • Number val // 数字值 // 所有子元素值的总和

传递的每个子元素具有以下变量:

  • Number val // 数字 数值 // 点的值
  • Number level // 数字层级 // 节点在树中的层级

一个起始点可以是以下内容

functionmyFunction(parent, children){ childrenAreas =[]; children.forEach(function(child){// Do some calculations// These return values are required for each child childrenAreas.push({x: someXValue,y: someYValue,width: someWidth,height: someHeight });});return childrenAreas;};

当算法函数完成后,我们需要通过扩展treemap原型来添加该函数

Highcharts.seriesTypes.treemap.prototype.myCustomAlgorithm = myFunction;

之后在声明图表选项时,应指定series.layoutAlgorithm为你的新自定义算法

const chart =newHighcharts.Chart({...series:[{layoutAlgorithm:"myCustomAlgorithm",...}],...});

使用层级

levels 选项允许在特定层级设置选项。这在每当数据树中的某一层级上的所有点都需要突出显示并与系列中的其他点不同的时候非常有用。

以下是一个示例,第一层将使用“切片与切块”算法,其余层将使用“方形化”算法。此外,所有第二层的点都将被着色为蓝色,而其他点将为红色。

const chart =newHighcharts.Chart({...series:[{layoutAlgorithm:'squarified',color:'red',levels:[{level:1,layoutAlgorithm:'sliceAndDice'},{level:2,color:'blue'}],...}],...});
层级是恒定的:

levelIsConstant 选项与层级和 allowTraversingTree 选项一起使用。默认情况下,它设置为 true。当设置为 false 时,钻取时可见的第一层被视为第一层。否则,层级将与树结构中的层级相同。

一个示例 example,其中levelIsConstant被设置为假。

遍历层级

当 allowTraversingTree 选项为 true 时,点击某个点将把该点设为渲染的根节点。为了帮助导航各层,渲染了面包屑,显示一个返回上一级的按钮或返回到根节点的完整路径。

了解更多关于面包屑导航的信息 这里。here.

分组标题和数据标签

数据标签可以像应用于其他系列一样应用于树图,默认的数据层级位置在节点的中心。可以为每个层级指定数据标签。

一种特殊的数据标签形式是分组标题。要启用分组标题功能,请将
dataLabels.headers
选项设置为 true。最常用的应用标题的方法是在特定层级上启用它们。默认情况下,标题会占据分组节点内的空间,导致剩余空间减少,从而影响叶子节点的显示。这可能会导致叶子节点之间的相对大小失衡。为了避免这种情况,有一个实验性选项
nodeSizeBy,
可以将其设置为空leaf.

在这里插入图片描述

与 ColorAxis 一起使用

在这里插入图片描述

如果要与colorAxis一起使用,则必须同时包含modules/heatmap.js。

在将模块包含到你的项目中后,可以在图表选项中定义一个colorAxis对象。有关其选项的详细信息,请阅读 API .

const chart =newHighcharts.Chart({...colorAxis:{minColor:'#FFFFFF',maxColor: Highcharts.getOptions().colors[0]},...});

每个点都需要自己的 colorValue.

const chart =newHighcharts.Chart({...colorAxis:{...},series:[{...data:[{name:"Point 1",value:1,colorValue:5// This value decides which color on the scale that the point gets.}],...}],...});

完整示例请在这里查看

小点的树状图聚类

树状图聚类通过将数据点组织成更大的块,简化了大量数据的可视化,增强了可读性和性能。这种方法特别适合用紧凑、易于理解的格式展示海量信息。

要配置树状图聚类,可以使用cluster选项。在此选项中,您可以指定pixelWidth和pixelHeight,它们设置在区域被分组之前的最小像素大小。这些阈值确保较小的部分被合并成更大、更明显的区域,以提高可读性。name参数允许您为分组的节点定义自定义标签,这些标签会显示在工具提示、数据标签和其他图表元素中。有关其选项的详细信息,请查阅e API .

const chart =newHighcharts.Chart({...series:[{...type:"treemap",cluster:{enabled:true,pixelHeight:20,pixelWidth:10}...}],...});

完整示例请在这里查看

Options

有关树图选项的概述,请参阅 API.

模式演示

Read more

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

苹果最贵手机要来了!折叠屏iPhone将于9月亮相;部分高校严禁校内使用OpenClaw;黄仁勋预言:传统软件和APP或将消失 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * 多所高校要求警惕 OpenClaw 安全风险,部分严禁校内使用 * 荣耀 CEO 李健:荣耀机器人全栈自研,将聚焦消费市场 * 马化腾凌晨 2 点发声:还有一批龙虾系产品陆续赶来 * 前快手语言大模型中心负责人张富峥,已加入智源人工智能研究院,负责 LLM 方向 * 最新全球 AI 应用百强榜发布,豆包/DeepSeek/千问上榜 * 苹果折叠 iPhone 将于九月亮相,融合 iPhone 与 iPad 体验

By Ne0inhk
不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

不止“996”!曝硅谷AI创业圈「极限工作制」:每天16小时、凌晨3点下班、周末也在写代码

编译 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) “如果你周日去旧金山的咖啡馆,会发现几乎每个人都在工作。” 这是 AI 创业公司 Mythril 联合创始人 Sanju Lokuhitige 最近最直观的感受。去年 11 月,他特地搬到旧金山,只为了更接近 AI 创业浪潮的中心。但很快,他也被卷入了这股浪潮带来的另一面——一种越来越极端的工作文化。 Lokuhitige 坦言,他现在几乎每天工作 12 小时,每周 7 天。除了每周少数几场刻意安排的社交活动(主要是为了和创业者们建立联系),其余时间几乎都在写代码、做产品。 “有时候我整整一天都在编程,”他说,“我基本没有什么工作与生活的平衡。”而这样的生活,在如今的 AI 创业圈里并不算罕见。 旧金山 AI 创业圈的真实日常 一位在旧金山一家 AI

By Ne0inhk
黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

AI 究竟是什么?在 NVIDIA CEO 黄仁勋看来,它早已不只是聊天机器人或某个大模型,而是一种正在迅速成形的“新型基础设施”。 近日,黄仁勋在英伟达官网发布了一篇长文,提出一个颇具形象的比喻——AI 就像一块“五层蛋糕”。从最底层的能源,到芯片、基础设施、模型,再到最上层的应用,人工智能正在形成一整套完整的产业技术栈,并像电力和互联网一样,逐渐成为现代社会的底层能力。 这也是黄仁勋自 2016 年以来公开发表的第七篇长文。在这篇文章中,他从计算机发展史与第一性原理出发,试图解释 AI 技术栈为何会演化成如今的形态,以及为什么全球正在掀起一场规模空前的 AI 基础设施建设。 在他看来,过去几十年的软件大多是预先编写好的程序:人类设计好算法,计算机按指令执行,数据被结构化存储在数据库中,通过精确查询调用。而 AI 的出现打破了这一模式——计算机开始能够理解图像、文本和声音,并根据上下文实时生成答案、推理结果甚至新的内容。 正因为智能不再是预先写好的代码,而是实时生成的能力,支撑它运行的整个计算体系也必须被重新设计。

By Ne0inhk
猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去几年里,科技公司几乎都在同一件事上加速:让 AI 参与写代码。 从自动补全、自动生成函数,到直接修改系统配置,生成式 AI 已经逐渐走进真实生产环境。但最近发生在亚马逊的一连串事故,却给整个行业泼了一盆冷水——当 AI 开始真正参与生产环境开发时,事情可能远比想象复杂。 最近,多家媒体披露,本周二亚马逊内部紧急召开了一场工程“深度复盘(deep dive)”会议,专门讨论最近频繁出现的系统故障——其中,一个被反复提及的关键词是:AI 辅助代码。 一周 4 次严重事故,亚马逊内部紧急复盘 事情的起点,是最近一段时间亚马逊系统稳定性明显下降。 负责亚马逊网站技术架构的高级副总裁 Dave Treadwell 在一封内部邮件中坦言:“各位,正如大家可能已经知道的,最近网站及相关基础设施的可用性确实不太理想。” 为此,公司决定把原本每周例行举行的技术会议

By Ne0inhk