数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载本文围绕 G6A Graph Visualization Framework in JavaScript官方 API 文档 packages/site/docs/api/canvas.en.md 展开系统讲解画布操作的三大核心 API——Graph.getCanvas()、Graph.getSize()、Graph.setSize()并结合仓库源码剖析其背后的分层渲染架构与尺寸变更机制帮助读者在实战中完成画布实例获取、尺寸读取与动态调整等常见需求。一、画布操作 API 总览G6 提供了一系列画布操作 API用于控制与获取画布的基本信息。通过它们你可以获取画布实例拿到底层 Canvas 对象进行低层级画布操作图层、相机、光标等获取与设置画布尺寸读取当前画布容器的宽高或按需动态调整画布大小操作画布渲染器与图层访问分层渲染体系下的各图层与渲染器。这三个 API 均归属于graphGraph 实例的canvas能力分类源码中以apiCategory canvas标注是绝大多数 G6 应用都会用到的基础能力。二、Graph.getCanvas()获取画布实例2.1 方法签名与返回值getCanvas(): Canvas;调用graph.getCanvas()返回的是 G6 内部封装后的Canvas实例定义于 packages/g6/src/runtime/canvas.ts。从源码看其实现非常直接——直接返回运行时上下文中的画布对象// packages/g6/src/runtime/graph.ts public getCanvas(): Canvas { return this.context.canvas; }2.2 Canvas 实例提供的主要能力按官方文档说明返回的 Canvas 实例包含以下主要方法getLayer(name?: string)获取指定图层getLayers()获取所有图层getCamera()获取相机实例getRoot()获取根节点setCursor(cursor: string)设置鼠标光标样式。结合 packages/g6/src/runtime/canvas.ts 的源码Canvas类还提供getConfig()、getRenderer(layer)、getContextService(layer)、getBounds(group?)、getContainer()、getSize()、resize(width, height)、toDataURL()、destroy()以及多组坐标转换方法如getCanvasByViewport、getViewportByClient等。其中getLayer(layer: CanvasLayer main)按名称取图层若未找到则回退到main图层getMainLayerOfgetCamera(layer main)与getRoot(layer main)均以图层为粒度委托给对应antv/g画布实现setCursor(cursor)同时更新内部配置this.config.cursor并应用到主图层。2.3 分层渲染架构关键背景知识理解getLayer/getLayers之前需要先了解 G6 的分层渲染设计。在 packages/g6/src/types/canvas.ts 中定义了图层类型export type CanvasLayer background | main | label | transient;而在 packages/g6/src/runtime/canvas.ts 中默认开启多图层enableMultiLayer默认为true时使用四个图层background背景层、main主元素层、label标签层、transient临时层如拖拽过程中的临时绘制关闭多图层时则仅保留main单层。四个图层被放在同一容器内通过 CSSgrid布局叠加见configCanvasDom非main图层会设置pointerEvents nonemain图层还单独注册了DragNDropPlugin用于拖拽交互。分层的好处在于例如toDataURL()导出图片时可以分别克隆各图层根节点并精确重组见 packages/g6/src/runtime/canvas.ts而标签层与主元素层互不干扰。2.4 实战示例// 获取画布实例 const canvas graph.getCanvas(); // 获取主图层 const mainLayer canvas.getLayer(main); // 获取所有图层 const allLayers canvas.getLayers(); // 设置鼠标光标样式 canvas.setCursor(pointer); // 获取画布根节点 const root canvas.getRoot(); // 获取画布相机用于视口变换 const camera canvas.getCamera();2.5 测试用例佐证仓库测试代码大量使用该 API可印证其真实用法packages/g6/tests/unit/behaviors/drag-element.spec.ts通过graph.getCanvas().getConfig().cursor断言拖拽过程中光标在grab/grabbing之间切换packages/g6/tests/unit/behaviors/drag-canvas.spec.ts 与 scroll-canvas.spec.ts通过graph.getCanvas().getSize()读取画布尺寸参与断言packages/g6/tests/main.ts通过graph.getCanvas().getLayers()把各图层暴露到window.__g_instances__供调试。三、Graph.getSize()获取画布尺寸3.1 方法签名与返回值getSize(): [number, number];返回当前画布容器的尺寸为一个包含宽、高的二元数组。从源码看packages/g6/src/runtime/graph.ts 的实现优先委托给底层 Canvaspublic getSize(): [number, number] { if (this.context.canvas) return this.context.canvas.getSize(); return [this.options.width || 0, this.options.height || 0]; }而 Canvas.getSize() 则是直接读取内部配置public getSize(): [number, number] { return [this.extends.config.width || 0, this.extends.config.height || 0]; }也就是说返回的尺寸来自初始化时写入的width/height配置。若创建 Graph 时未显式指定宽高CanvasOptions 中注明“如果未设置则会自动获取容器宽度/高度”则会在初始化阶段自动测量容器得到实际值。3.2 实战示例// 获取画布尺寸 const [width, height] graph.getSize(); console.log(Canvas width:, width); console.log(Canvas height:, height); // 用尺寸信息做计算例如求中心点 const centerX width / 2; const centerY height / 2;3.3 相关联动视口中心的计算getSize()的结果与视口中心计算直接相关。在 packages/g6/src/runtime/viewport.ts 中getCanvasCenter()即基于宽高计算中心坐标public getCanvasCenter(): Point { const { canvas } this.context; const { width 0, height 0 } canvas.getConfig(); return [width / 2, height / 2, 0]; }该中心点在fitView、focusElement、坐标换算等视口操作中被广泛引用viewport.ts 等因此准确读取尺寸是做好视口控制的前提。在自定义节点/边中也可以像 packages/g6/tests/demos/element-html-sub-graph.ts 那样通过this.getSize()拿到画布宽高做布局计算。四、Graph.setSize(width, height)动态调整画布尺寸4.1 方法签名与参数说明setSize(width: number, height: number): void;该方法会同时更新画布与容器尺寸。参数说明如下参数说明类型默认值是否必填width画布宽度像素number-✓height画布高度像素number-✓4.2 底层实现与 resize 的关系packages/g6/src/runtime/graph.ts 中setSize的实现为public setSize(width: number, height: number): void { if (width) this.options.width width; if (height) this.options.height height; this.resize(width, height); }它先同步更新 Graph 的options.width / options.height保证后续getSize()读到一致的值再调用resize。而resizegraph.ts做了三件事若未传宽高则回退为容器实测尺寸sizeOf(container)若目标尺寸与当前画布尺寸一致则直接返回避免无效变更依次派发BEFORE_SIZE_CHANGE与AFTER_SIZE_CHANGE生命周期事件然后调用底层canvas.resize(...)。底层 Canvas.resize() 会遍历所有图层调用antv/g的canvas.resize(width, height)并在缩放后恢复相机位置与焦点从而保证 resize 后视口内容不发生漂移。4.3 实战示例// 设置为固定尺寸 graph.setSize(800, 600); // 也可以先读取再调整 const [w, h] graph.getSize(); graph.setSize(w 200, h 200);4.4 联动autoResize 自动尺寸调整除手动调用setSize外G6 还支持通过配置autoResize让画布随窗口变化自动调整。该配置项定义于 packages/g6/src/spec/canvas.ts/** * zh/ 是否自动调整画布大小 * * en/ whether to auto resize canvas * defaultValue false * remarks * zh/ 基于 window.onresize 事件自动调整画布大小 * * en/ Automatically adjust the canvas size based on the window.onresize event */ autoResize?: boolean;对应实现在 graph.ts当autoResize为true时Graph 会监听全局resize事件并在销毁时移除监听graph.ts。这意味着响应式布局有两种典型做法// 方式一显式调用 window.addEventListener(resize, () { graph.setSize(window.innerWidth, window.innerHeight); }); // 方式二开启自动调整 const graph new Graph({ container: #container, autoResize: true, // ... 其他配置 });五、综合实战一个响应式、居中的画布将上述 API 组合使用即可实现常见的“窗口变化后画布自适应并重新居中”场景import { Graph } from antv/g6; const graph new Graph({ container: document.getElementById(container)!, data: { nodes: [...], edges: [...] }, autoResize: true, }); graph.render(); // 用 getSize 计算中心并聚焦 const [width, height] graph.getSize(); console.log(画布中心位于 (${width / 2}, ${height / 2})); // 手动调整尺寸后重新适配视口 graph.setSize(1200, 800); graph.fitView();再配合getCanvas()做低层级控制例如在需要临时屏蔽交互时修改光标const canvas graph.getCanvas(); canvas.setCursor(crosshair); // 或 grab / pointer 等任意 CSS cursor 值六、小结API作用底层要点graph.getCanvas()获取底层 Canvas 实例返回context.canvas可操作图层、相机、根节点、光标graph.getSize()读取画布尺寸委托Canvas.getSize()读取内部配置宽高返回[width, height]graph.setSize(w, h)动态调整画布尺寸更新 options 后调用resize派发尺寸变更事件并保持相机不漂移这三个 API 覆盖了“拿到画布、读尺寸、改尺寸”的完整闭环配合 G6 的四层分层渲染background/main/label/transient与autoResize自动调整能力可以支撑从静态展示到复杂响应式交互的绝大多数业务场景。更多画布细节可继续阅读Canvas 运行时实现packages/g6/src/runtime/canvas.tsGraph 运行时实现packages/g6/src/runtime/graph.ts画布配置项定义packages/g6/src/spec/canvas.ts视口与坐标换算packages/g6/src/runtime/viewport.ts赞分享数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载相关推荐G6 画布操作 API 完全指南getCanvas / getSize / setSize 实战详解G6 画布操作 API 完全指南getCanvas / getSize / setSize 实战详解 G6 作为一款 JavaScript 图可视化框架将底数据可视化前端图表库RxJava 阻塞式 Observable 操作符完全指南blockingFirst 到 blockingIterable 的用法与底层实现RxJava 阻塞式 Observable 操作符完全指南blockingFirst 到 blockingIterable 的用法与底层实现 本文以 RxJa后端异步编程Cytoscape.js 元素动画完全指南eles.animate() 的 API 用法与底层实现原理Cytoscape.js 元素动画完全指南eles.animate 的 API 用法与底层实现原理 本文聚焦 Cytoscape.js 图库中 元素集合co数据可视化上一篇DevDocs Desktop把几十份 API 文档收进一个窗口的终极桌面阅读神器下一篇LSD (LSDeluxe) 终极指南现代化ls命令的完美替代方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
从Word题库到自测刷题:网络安全基础知识考核与自动化解析实践 简介:面向网络安全入门学习者、企业员工及备考人员,这份题库围绕《网络安全法》、计算机病毒防治、网络交易风险、密码保护、设备管理、涉密信息处理等热点编排,既能用于企业安全培训自测,也可作为信息安全岗位考核的复习资料。包… · 2026/9/24 20:23:51
前端国际化不入侵业务代码的轻量级i18n方案:DOM文本节点扫描替换 搞国际化的时候,最烦的就是业务代码里到处塞t(xxx),尤其是一堆历史项目,改起来恨不得重写。我这边就是被这种需求逼出来的:一个内部中后台系统,页面多、文案杂、排期还紧,正经引入 i18n 框架再一个个改模板… · 2026/9/24 20:23:51
基于MATPOWER和粒子群算法的IEEE 30节点无功优化实现 1. 为什么选IEEE 30节点和MATPOWER这套组合1.1 无功优化到底在优化什么先说个容易被新手忽略的事实:无功优化不是让所有节点电压都等于1.0pu,也不是把网损压到理论最低就算赢。它的本质是在满足系统安全约束(电压上下限、发电机无功出力上下限… · 2026/9/24 20:23:45
DeepSeek Harness桌面端:智能体编排与多Agent协同实战 1. 先聊聊这个"偷偷上线"的 Harness 桌面端最近圈子里都在传一件事:DeepSeek 生态里冒出了一个叫 Harness 的桌面端客户端,而且不是那种社区爱好者随便搓的小工具,是能正经编排智能体的工程化产品。我一开始以为是哪个开源项目套了… · 2026/9/24 21:35:52
Coder家族解析:从自托管开发环境到Qwen Coder本地部署 最近不管在技术群还是社区,被问到最多的是这几个词:coder 怎么下载、Qwen Coder 在 Mac 上怎么部署、AI Coder 现在到底能不能干活。还有人拿着一款叫 Kh Coder 的软件来问我,这跟写代码有什么关系。正好我前两周在 Mac mini 上完整做了一轮“… · 2026/9/24 21:35:52
腾讯数字人联手大模型知识引擎:打造既像人又懂行的AI交互方案 前阵子和一个做企业数字化转型的朋友吃饭,他提到一个挺有代表性的需求:公司准备上一套数字人来做展厅讲解和产品咨询,但试了一圈发现,普通的语音播报机器人太死板,纯用大模型接口又担心业务知识回答不准。其实他这个困… · 2026/9/24 21:35:52
让 AI 学会“读说明书”,Claude Code 的 AGENTS.md 实战拆解 让 AI 学会“读说明书”,Claude Code 的 AGENTS.md 实战拆解这几天 Claude Code 的更新频率快得吓人,一周之内连发九个版本,社区里讨论最热烈的话题不是新功能,反而是 AGENTS.md 这个看似不起眼的配置文件。说实话,我一… · 2026/9/24 21:35:52
软件架构的本质:对抗复杂度的系统工程 干了快十年的软件架构设计和开发,被问得最多的一句话是:架构到底是什么?有人说架构是画框图,有人说是技术选型,也有人说是为了满足未来扩展性。我自己的回答一直很直接:软件架构的本质,就是一门… · 2026/9/24 21:35:52
Mac本地部署Qwen Coder实战:从Ollama安装到接入IDE全流程 最近很多同行都在问我同一个问题:AI coder到底怎么选、怎么落地到自己日常开发里?搜索“coder”这个词的时候,评论区又总会冒出一堆“咋下载”“怎么部署”的声音。说实话,这个搜索热度我一点都不意外——“coder”早就不只是“程… · 2026/9/24 21:35:46
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44