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

news2024/11/27 13:40:19

节点

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]: number
      prop1: 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 (
    <div
      ref={containerRef}
      id="graphContainer"
      style={{ height: "100%", width: "100%" }}
    ></div>
  );
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有色金属冶炼VR虚拟场景互动教学有何优势

真实模拟&#xff1a;VR虚拟现实技术可以提供一个真实的虚拟环境&#xff0c;模拟钢铁制造现场&#xff0c;包括设备、工艺流程、操作规程等&#xff0c;使学员获得直观、真实的体验。 安全可靠&#xff1a;钢铁制造技能培训可以在虚拟环境中进行&#xff0c;不会对人员或设备造…

LeetCode | 876. 链表的中间结点

LeetCode | 876. 链表的中间结点 OJ链接 我们这里有一个很好的思路&#xff0c;我们定义两个变量&#xff0c;第一个变量走两步&#xff0c;第二个变量走一步&#xff0c;一直循环&#xff0c;当第一个变量走到最后的时候停下来&#xff0c;这个时候第二个变量就是中间的那个…

谷歌AlphaFold模型迎来重大突破!可以预测生物分子、配体

11月1日&#xff0c;谷歌旗下的AI研究机构DeepMind在官网发布了&#xff0c;蛋白质结构预测模型 AlphaFold的最新技术进展&#xff1a;已显著提升了预测准确性&#xff0c;并将覆盖范围从蛋白质扩展至其他生物分子&#xff0c;包括配体&#xff08;小分子&#xff09;。 据悉&…

Midjourney干货篇 - 与AI对话,如何写好prompt

文章目录 1、语法2、单词3、要学习prompt 框架4、善用参数&#xff08;注意版本&#xff09;5、善用模版6、临摹7、垫图 木匠不会因为电动工具的出现而被淘汰&#xff0c;反而善用工具的木匠&#xff0c;收入更高了。 想要驾驭好Midjourney&#xff0c;可以从以下方面出发调整&…

回归预测 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测

Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量…

树形结构数据展示及返回上一级

11月1日&#xff0c;又是搬砖的一天&#xff0c;让我们红尘作伴&#xff0c;活的潇潇洒洒。。。。。。 html <template><view class"content"><view><input class"sreachTool" v-model"toolValue"/><van-icon name…

java项目之医院病历管理系统(ssm框架)

项目简介 医院病历管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、医院公告管理、用户管理、科室信息管理、医生管理、出诊信息管理、预约时间段管理、预约挂号管理、门诊病历管理、就诊评价管理、系统管理。医生&#xff1a;个人中心、出诊信息管理、预约…

sw 怎么装新版本

我们在安装solidworks时&#xff0c;有时候会提示A newer version of this applic ation is already installed. Installation stopped.如下图所示 这时候需要点继续安装 然后会出现下图所示情况&#xff0c;vba7.1安装未成功 这是因为我们电脑中以前安装过更高版本的solidw…

服务器数据恢复—EMC存储pool上数据卷被误删的数据恢复案例

服务器数据恢复环境&#xff1a; EMC Unity某型号存储&#xff0c;连接了2台硬盘柜。2台硬盘柜上创建2组互相独立的POOL&#xff0c;2组POOL共有21块520字节硬盘。21块硬盘组建了2组RAID6&#xff0c;1号RAID6有11块硬盘. 2号RAID6有10块硬盘。 服务器故障&检测&#xff1…

SDL Passolo 2022.0.135 Crack

SDL Passolo是一款非常专业的本地化工具。它能够满足软件本地化和游戏行业的特定需求&#xff0c;可以显着加快本地化流程并提高输出质量&#xff0c;简化软件本地化&#xff0c;加快翻译流程&#xff0c;高效翻译图形用户界面&#xff0c;SDL Passolo的是一个特定的软件本地化…

Vue3问题:如何实现级联菜单的数据懒加载?

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约3100字&#xff0c;整篇阅读大约需要5分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

太阳能技术相关

0 Preface/Foreword Energy Harvesting&#xff1a;猎能技术 太阳能光电/光伏&#xff1a;PhotoVoltaic 热电&#xff1a;Thermoelectric LoRa Alliance&#xff1a;支持物联网&#xff08;IoT&#xff09;低功耗广域网&#xff08;LPWAN&#xff09;开放LoRaWAN标准的全球…

如何提高滚柱导轨的精度?

滚柱导轨是一种高精度的传动零部件&#xff0c;起导向作用&#xff0c;如果滚柱导轨的精度受损&#xff0c;则无法达到预期的使用效果&#xff0c;那么&#xff0c;我们应该如何提高滚柱导轨的精度呢&#xff1f; 1、优化材料选型&#xff1a;选用高质量的材料作为制造导轨的原…

分析每月开销曲线图,合理记账助您掌控支出趋势!

亲爱的用户&#xff0c;您是否曾经为不知道自己每月开销的情况而感到困惑&#xff1f;现在&#xff0c;我们为您提供了一款智能记账工具&#xff0c;通过分析每月开销曲线图&#xff0c;帮助您合理记账&#xff0c;掌控支出趋势&#xff01; 首先&#xff0c;第一步&#xff0…

本地仓库转为git仓库推送到gitee

通常有两种获取 Git 项目仓库的方式&#xff1a; 方式一&#xff1a;将尚未进行版本控制的本地目录转换为 Git 仓库&#xff1b; 方式二&#xff1a;从其它服务器 克隆 一个已存在的 Git 仓库。 两种方式都会在你的本地机器上得到一个工作就绪的 Git 仓库。 方式一&#xff1a…

10.31同步异步清零,阻塞与非阻塞例子,ROM,RAM,边沿检测实现

同步与异步清零 就是当复位信号发生变化&#xff0c;从1到0时立刻进行复位&#xff0c;negedge触发模块&#xff0c;即可工作&#xff1b;但如果到0后一直没有发生变化&#xff0c;即保持为0&#xff0c;那么就是在不断的时钟上升沿触发电路&#xff0c;但是都会因为复位信号为…

学习c++的第二天

目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…

影视企业有哪些方式将视频文件快速海外跨国传输国内?

影视行业是一个高度国际化的行业&#xff0c;影视企业在跨国合作、制作、发行等方面有着强烈的需求。然而&#xff0c;影视企业在跨国文件传输方面也面临着诸多的问题和难题。视频文件通常具有较大的文件大小、多样的文件格式、高要求的文件质量等特点&#xff0c;这些特点使得…

WSL安装Ubuntu

先安装wsl2 安装Ubuntu 打开windows商店&#xff0c;搜索对应版本的Ubuntu&#xff0c;点击获取进度跑完后&#xff0c;点击打开&#xff0c;就可以完成安装 删除Ubuntu版本 wsl --unregister Ubuntu-18.04安装位置迁移 正常情况下Ubuntu是被安装在C盘&#xff0c;我们需要…

Java架构师数学与经济管理

目录 1 导学2 最小生成树3 最短路径4 网络与最大流量5 线性规划6 动态规划6.1 伏格尔法7 博弈论7.1 状态转移矩阵7.2 排队论8 决策论8.1 决策树9 数学建模想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学