antv/g6 节点、及自定义节点

节点

AntV G6 中内置节点支持的通用属性通常包括以下几个:

  1. id:节点的唯一标识符。

  2. x 和 y:节点的位置坐标。

  3. label:节点的标签文本。

  4. style:节点的样式,用于设置节点的外观,可以包括填充颜色、边框颜色、线宽等。

  5. size:节点的大小。

  6. type:节点的形状,表示节点的外观,可以是圆形、矩形等。

  7. anchorPoints:指定边连入节点的连接点的位置(相对于该节点而言)。

  8. labelCfg:用于定义标签文本的样式和位置,可以包括字体大小、颜色、位置偏移等。

样式属性:
AntV G6 中的节点样式属性(style)用于定义节点的外观,包括填充颜色、边框颜色、线宽等。以下是一些常见的节点样式属性:

  1. fill:填充颜色,用于定义节点的背景颜色。

  2. stroke:边框颜色,用于定义节点的边框颜色。

  3. lineWidth:线宽,用于定义节点的边框宽度。

  4. opacity:不透明度,用于定义节点的透明度,取值范围在 0 到 1 之间。

  5. radius:节点的半径,仅适用于圆形节点。

  6. width 和 height:节点的宽度和高度,仅适用于矩形节点。

  7. symbol:节点的图标形状,可以是图标的名称或路径。

  8. size:节点的大小,表示节点的半径或宽度/高度,具体取决于节点的形状。

  9. endArrow:定义边的末端箭头样式,可以设置箭头的形状和颜色。

  10. startArrow:定义边的起始箭头样式,同样可以设置箭头的形状和颜色。

  11. lineDash:定义边框的虚线样式,可以创建虚线边框。

这些节点样式属性允许你自定义节点的外观,以满足你的可视化需求。你可以根据节点的形状和具体的设计来设置这些属性。在节点数据中,你可以通过在 style 对象中定义这些属性来自定义节点的样式。例如:

const data = {nodes: [{id: 'node1',x: 100,y: 100,size: 20,label: 'Node 1',labelCfg: {style: {fontSize: 12,},position: 'bottom',offset: 1,},style: {fill: '#5B8FF9', // 填充颜色stroke: '#5B8FF9', // 边框颜色lineWidth: 2, // 线宽opacity: 0.8, // 不透明度size: 40, // 节点大小endArrow: {path: 'M 0,0 L 10,5 L 10,-5 Z', // 箭头形状fill: '#999', // 箭头颜色},},},],
};

内置节点

G6 提供了一些内置的节点类型,这些节点类型具有不同的形状和样式。以下是一些常见的内置节点类型:

  1. circle:圆形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'circle', // 节点类型// ... 其他配置},
});
  1. rect:矩形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'rect',// 其他配置},
});
  1. ellipse:椭圆形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'ellipse',// 其他配置},
});
  1. diamond:菱形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'diamond',// 其他配置},
});
  1. triangle:三角形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'triangle',// 其他配置},
});
  1. star:星形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'star',// 其他配置},
});
  1. modelRect:带标签的矩形节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'modelRect',// 其他配置},
});
  1. Image:图片类型节点。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'image',label: 'AntV Team',// 其他配置},
});
  1. dount:标签文本位于圆形中央,圆形周围根据给定字段的占比绘制甜甜圈统计图。
const graph = new G6.Graph({container: 'mountNode',width: 800,height: 600,defaultNode: {type: 'donut', // 节点类型donutAttrs: {  // 甜甜圈字段,每个字段必须为 [key: string]: numberprop1: 10,prop2: 20,prop3: 25,prop5: 10,prop6: 20,},// donutColorMap: { // 甜甜圈颜色映射,字段名与 donutAttrs 中的字段名对应。不指定则使用默认色板//   prop1: '#8eaade',//   prop2: '#55a9f2',//   prop3: '#0d47b5'// },// ... 其他配置},
});

自定义节点

若内置节点无法满足需求,还可以通过 G6.registerNode(typeName: string, nodeDefinition: object, extendedNodeType?: string) 进行自定义节点,方便开发更加定制化的节点,包括含有复杂图形的节点、复杂交互的节点、带有动画的节点等。

import G6 from "@antv/g6";
import rightImg from '../images/1.svg'
const Util = G6.Util;const getStarPoints = (cx: any, cy: any, r: any, n: any) => {const angle = (360 / n) * (Math.PI / 180); // 计算五角星每个角的弧度const starPoints = [];for (let i = 0; i < n; i++) {const x = cx + r * Math.cos(i * angle);const y = cy + r * Math.sin(i * angle);starPoints.push([x, y]);}return starPoints;
};export const registerCustomNode = (name: any, options?: any) => {G6.registerNode(name, {draw(cfg: any, group: any) {const size = cfg.size || 40; // 节点的大小const shape: any = group.addShape("polygon", {attrs: {points: getStarPoints(cfg.x, cfg.y, size, 5), // 获取五角星的顶点坐标stroke: "#999",fill: "#fff",},name: "star-shape",});// 添加节点文本group.addShape("text", {attrs: {x: cfg.x,y: cfg.y + size + 10, // 调整 label 的位置textAlign: "center",text: cfg.label || "", // 节点文本fill: "#333",},name: "text-shape",});// 添加svg图标group.addShape('image',{attrs:{x: cfg.x,y:cfg.y,width:20,height:20,img: rightImg,file:'#52C41A'},id:'image-shape',name: 'image-shape'})return shape;},setState(name: any, value: any, item: any) {const group = item.getContainer();const shape = group.get("children")[0]; // 顺序根据 draw 时确定console.log("旋转角度", item?._cfg);if (name === "active") {if (value) {// 悬停样式shape.attr("fill", "red");} else {shape.attr("fill", "#1890ff");}}if (name === "selected") {if (value) {// 选中样式shape.attr("stroke", "red");} else {shape.attr("stroke", "#1890ff");}}},});
};

上面的代码注册了一个自定义节点类型,该节点以五角星的形状展示,并包括了以下功能:
节点形状为五角星,通过 draw 方法绘制。支持节点的悬停和选中样式(悬停active和选中selected的名字是可以自己定的),通过 setState 方法实现。可以修改 label 的位置,通过在 draw 方法中调整文本元素的位置来实现。添加了图片也可以根据自己需求添加其他图片,甚至是icon图标。
使用:

import React, { useEffect, useRef } from "react";
import G6 from "@antv/g6";
import { registerCustomNode } from "../customer/registerNodes";
import _ from "lodash";export default function GraphInstance() {const containerRef = useRef<HTMLDivElement>(null);const graphRef = useRef<any>();useEffect(() => {initDraw();}, []);const initDraw = () => {registerCustomNode("mynode");graphRef.current = new G6.Graph({linkCenter: true,container: containerRef.current || "",height: 800,modes: {default: ["drag-node", "drag-canvas"],},layout: {type: "gforce",},});const data = {nodes: [{id: "node1",x: 100,y: 100,size: 20,label: "Node 1",type: "mynode",},{id: "node2",x: 300,y: 100,size: 20,label: "Node 2",type: "mynode",},],edges: [{ source: "node1", target: "node2", label: "", type: "cosline" }],};// 渲染图表graphRef.current.data(data);graphRef.current.render();graphRef.current.on("node:mouseenter", (evt: any) => {const { item } = evt;graphRef.current.setItemState(item, "active", true);});graphRef.current.on("node:mouseleave", (evt: any) => {const { item } = evt;graphRef.current.setItemState(item, "active", false);});graphRef.current.on("node:click", (evt: any) => {const { item } = evt;graphRef.current.setItemState(item, "selected", true);});graphRef.current.on("canvas:click", (evt: any) => {const nodes = graphRef.current.findAllByState("node", "selected");const edges = graphRef.current.findAllByState("edge", "selected");_.forEach(nodes, (item) => {graphRef.current.setItemState(item, "selected", false);});_.forEach(edges, (item) => {graphRef.current.setItemState(item, "selected", false);});});};return (<divref={containerRef}id="graphContainer"style={{ height: "100%", width: "100%" }}></div>);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/176950.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows系统卸载mysql

1. win r 输入 control 打开控制面板 2.搜索mysql&#xff0c;删除搜索内容 3.删除相应路径下的mysql文件夹C:\Program Files C:\ProgramData 4.删除注册表&#xff0c;win r 输入 regedit 打开注册表 5.搜索MySql 删除掉 完成

高等数学啃书汇总重难点(十)重积分

方法性的一章&#xff0c;看着唬人&#xff0c;实际上定积分学得熟练&#xff0c;就可以很轻松的掌握这一章的内容&#xff0c;重点在于计算各种坐标下的二重或三重积分~ 1.几何意义 2.定义 3.性质 4.直角坐标计算二重积分 5.极坐标计算二重积分 6.三重积分 7.重积分的应用

国际物流常见风险如何规避_箱讯科技

外贸物流是国际贸易的重要环节&#xff0c;其管理和效率的高低直接影响着贸易的成本和效益。因此&#xff0c;外贸企业应该重视物流的组织和管理&#xff0c;提高物流运作的效率。 国际物流基础知识 01什么是“双清包税”和“双清不包税” 双清包税上门又叫双清包税到门&…

论文翻译-ImageNet Classification with Deep Convolutional Neural Networks

[toc] 前言 AlexNet是是引领深度学习浪潮的开山之作&#xff0c;即使是我们现在进入了ChatGPT时代&#xff0c;这篇论文依然具有一定的借鉴意义。AlexNet的作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的学生。网上流行说 Hinton、LeCun和Bengio是神经网…

京东h5st逆向 h5st代码之拓展

知识点 node安装模块 crypto-js JavaScript 中的加密库 则更偏向于消息摘要算法、对称加密和简单的哈希函数&#xff0c;支持 AES、DES、SHA-1、HMAC 等诸多算法&#xff0c;适用于对客户端本地存储的数据进行加密、散列或签名处理等场景 axios 一旦安装成功&#xff0c;我们就…

prometheus服务发现

Consul简介 ◼ 一款基于golang开发的开源工具&#xff0c;主要面向分布式&#xff0c;服务化的系统提供服务注册、服务发现和配置管理 的功能 ◼ 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能 部署 curl -LO https://releases.hashicorp…

Xcode中如何操作Git

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

kubernetes-service微服务

目录 一、service微服务 二、Ipvs模式 三、ClusterIP 1.ClusterIP 2.headless 四、NodePort 1.NodePort 2.默认端口 五、LoadBalancer 1.LoadBalancer 2.metallb 六、ExternalName 一、service微服务 Kubernetes Service微服务是一种基于Kubernetes的微服务架构&…

二氧化铈纳米棒 Cerium Oxide Nanorods 氧化铈纳米棒

二氧化铈纳米棒 &#xff08;西&#xff09;产品名称&#xff1a;二氧化铈纳米棒 &#xff08;安&#xff09;英文名称&#xff1a;Cerium Oxide Nanorods &#xff08;瑞&#xff09;成分&#xff1a;氧化铈纳米棒、乙醇 &#xff08;禧&#xff09;浓度&#xff1a;0.1mg…

仿东郊到家按摩小程序app开发搭建

最新版的仿东郊到家按摩小程序&#xff0c;支持上门服务系统&#xff0c;全开源&#xff0c;并且支持公众号、小程序和app。前端使用uniapp&#xff0c;后端使用php&#xff0c;价格合理。用户端功能模块包括技师选择、预约服务、优惠券、订单等&#xff0c;还有意见功能和城市…

Spring Security 6.1.x 系列(4)—— 基于过滤器链的源码分析

一、自动配置 在 Spring Security 6.1.x 系列&#xff08;1&#xff09;—— 初识Spring Security 中我们只引入spring-boot-starter-security 依赖&#xff0c;就可以实现登录认证&#xff0c;这些都得益于Spring Boot 的自动配置。 在spring-boot-autoconfigure模块中集成了…

LSF 守护程序和进程、集群通信路径和安全模型

LSF 细观 了解在 LSF 主机上运行的各种守护进程&#xff0c;LSF 集群通信路径&#xff0c;以及 LSF 如何容许集群中的主机故障。 1、LSF 守护程序和进程 集群中的每个主机上都运行多个 LSF 进程。 正在运行的进程的类型和数量&#xff0c;取决于主机是主节点还是计算节点。 主…

吴恩达《机器学习》2-2->2-4:代价函数

一、代价函数的概念 代价函数是在监督学习中用于评估模型的性能和帮助选择最佳模型参数的重要工具。它表示了模型的预测输出与实际目标值之间的差距&#xff0c;即建模误差。代价函数的目标是找到使建模误差最小化的模型参数。 二、代价函数的理解 训练集数据&#xff1a;假设我…

【ELFK】之Filebeat

一、Filebeat介绍 1、Filebeat是什么&#xff1f; Filebeat适用于转发和集中数据的轻量级传送工具&#xff0c;Filebeat监视了指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将他们转发到Elasticsearch或Logstash进行索引。 **Filebeat的工作方式&#xff1a;*…

【ETL工具】Datax-ETL-SqlServerToHDFS

&#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&…

iPhone连不上Wi-Fi?看完这篇文章你就知道了!

大家在使用苹果手机的过程中有没有遇到过这样的情况&#xff1a;手机突然连接不上Wi-Fi&#xff0c;或者连接了也根本使用不了。遇到上述情况请不要着急&#xff0c;iphone连不上wifi是由很多种原因导致的。那么&#xff0c;iPhone连接不上Wi-Fi时该怎么办呢&#xff1f; 我们…

css写个三角形

点击三角形&#xff0c;展开或者收起内容 <template><div><div class"zhankai" click"btn()">展开 <span :class"{sanjiao:true,rotate:flag}"></span></div><!-- 展示或者收起 --><el-collapse-…

基于YOLOv8模型暗夜下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型暗夜下人脸目标检测系统可用于日常生活中检测与定位黑夜下人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法…

大数据之路-日志采集

数据采集作为大数据体系中的第一环节&#xff0c;对如何全面、高性能、规范完成海量数据的采集&#xff0c;并将其传输到大数据平台。 1.浏览器的页面日志采集 1.1 页面浏览日志采集流程 页面浏览日志是最基础的互联网日志&#xff0c;其中页面浏览量&#xff08;PageView&am…

redis6.0源码分析:跳表skiplist

文章目录 前言什么是跳表跳表&#xff08;redis实现&#xff09;的空间复杂度相关定义 跳表&#xff08;redis实现&#xff09;相关操作创建跳表插入节点查找节点删除节点 前言 太长不看版 跳跃表是有序集合zset的底层实现之一&#xff0c; 除此之外它在 Redis 中没有其他应用。…