AntV-G6 -- 将G6图表应用到项目中

1. 效果图

2. 安装依赖

npm install --save @antv/g6 

3. 代码

import { useEffect } from '@alipay/bigfish/react';
import G6 from '@antv/g6';

const data = {
  id: 'root',
  label: '利息收入',
  subLabel: '3,283.456',
  ratio: 3,
  children: [
    {
      id: 'child-a',
      label: '平均利息',
      subLabel: '9%',
      ratio: 1,
      increase: true,
    },
    {
      id: 'child-b',
      label: '贷款余额',
      subLabel: '1,789,567',
      ratio: 23,
      increase: true,
      children: [
        {
          id: 'child-b-a',
          label: '投放金额',
          subLabel: '2,385,124',
          ratio: 17,
          increase: true,
        },
        {
          id: 'child-b-b',
          label: '还款金额',
          subLabel: '595,557',
          ratio: 12,
          increase: true,
        },
      ],
    },
    {
      id: 'child-c',
      label: '还款期限',
      subLabel: '7',
      ratio: 23,
      increase: false,
    },
  ],
};

export default function TreeG6() {
  // root node
  G6.registerNode('root', {
    draw: (cfg, group) => {
      const size = [80, 30];
      const keyShape = group.addShape('rect', {
        attrs: {
          width: size[0],
          height: size[1],
          x: -size[0] / 2,
          y: -size[1] / 2,
          fill: 'rgb(19, 33, 92)',
          radius: 5,
        },
        draggable: true,
        name: 'root-keyshape',
      });
      group.addShape('text', {
        attrs: {
          text: `${cfg.ratio}%`,
          fill: 'rgba(255, 255, 255, 0.85)',
          fontSize: 6,
          x: 10 - size[0] / 2,
          y: 3,
        },
        draggable: true,
        name: 'ratio-shape',
      });
      group.addShape('text', {
        attrs: {
          text: `${cfg.label}`,
          fill: 'rgba(255, 255, 255, 0.85)',
          fontSize: 9,
          x: -6,
          y: 0,
        },
        draggable: true,
        name: 'label-shape',
      });
      group.addShape('line', {
        attrs: {
          x1: -6,
          x2: 35,
          y1: 2,
          y2: 2,
          stroke: 'rgba(255, 255, 255, 0.85)',
          lineWidth: 0.5,
        },
        draggable: true,
        name: 'divider-shape',
      });
      group.addShape('text', {
        attrs: {
          text: `${cfg.subLabel}`,
          fill: 'rgba(255, 255, 255, 0.65)',
          fontSize: 6,
          x: -6,
          y: 10,
        },
        draggable: true,
        name: 'sublabel-shape',
      });
      return keyShape;
    },
  });

  // level1 node
  G6.registerNode(
    'level1node',
    {
      draw: (cfg, group) => {
        const size = [60, 40];
        const keyShape = group.addShape('rect', {
          attrs: {
            width: size[0],
            height: size[1],
            x: -size[0] / 2,
            y: -size[1] / 2,
            fill: 'rgb(213, 225, 247)',
            radius: 5,
          },
          draggable: true,
          name: 'level1node-keyshape',
        });
        group.addShape('text', {
          attrs: {
            text: `${cfg.label}`,
            fill: 'rgba(19, 33, 92, 0.65)',
            fontSize: 6,
            x: 0,
            y: -6,
            textAlign: 'center',
          },
          draggable: true,
          name: 'label-shape',
        });
        group.addShape('text', {
          attrs: {
            text: `${cfg.subLabel}`,
            fill: 'rgba(19, 33, 92, 0.65)',
            fontSize: 8,
            x: 0,
            y: 6,
            fontWeight: 800,
            textAlign: 'center',
          },
          draggable: true,
          name: 'sublabel-shape',
        });
        group.addShape('rect', {
          attrs: {
            x: -12,
            y: 8,
            width: 25,
            height: 8,
            radius: 4,
            fill: cfg.increase ? 'rgb(127, 193, 193)' : 'rgb(220, 124, 125)',
          },
          draggable: true,
          name: 'ratio-box',
        });
        group.addShape('text', {
          attrs: {
            text: `${cfg.ratio}%`,
            fill: 'rgba(255, 255, 255, 0.85)',
            fontSize: 6,
            x: 0,
            y: 9,
            textAlign: 'center',
            textBaseline: 'top',
          },
          draggable: true,
          name: 'ratio-shape',
        });
        // edge end
        group.addShape('line', {
          attrs: {
            x1: -size[0] / 2,
            x2: -size[0] / 2 + 6,
            y1: 0,
            y2: 0,
            lineWidth: 1,
            stroke: 'rgb(19, 33, 92)',
          },
        });
        group.addShape('circle', {
          attrs: {
            r: 2,
            x: -size[0] / 2 + 6,
            y: 0,
            fill: 'rgb(19, 33, 92)',
          },
        });
        return keyShape;
      },
      update: undefined,
    },
    'rect',
  );

  // other node
  G6.registerNode(
    'othernode',
    {
      draw: (cfg, group) => {
        const size = [100, 30];
        const keyShape = group.addShape('rect', {
          attrs: {
            width: size[0],
            height: size[1],
            x: -size[0] / 2,
            y: -size[1] / 2,
            fill: 'rgb(213, 225, 247)',
            radius: 5,
          },
          draggable: true,
          name: 'level1node-keyshape',
        });
        group.addShape('text', {
          attrs: {
            text: `${cfg.label}`,
            fill: 'rgba(19, 33, 92, 0.65)',
            fontSize: 6,
            x: 10 - size[0] / 2,
            y: -2,
            textAlign: 'left',
          },
          draggable: true,
          name: 'label-shape',
        });
        group.addShape('text', {
          attrs: {
            text: `${cfg.subLabel}`,
            fill: 'rgba(19, 33, 92, 0.65)',
            fontSize: 8,
            fontWeight: 800,
            x: 10 - size[0] / 2,
            y: 8,
            textAlign: 'left',
          },
          draggable: true,
          name: 'sublabel-shape',
        });
        group.addShape('rect', {
          attrs: {
            x: 12,
            y: -4,
            width: 25,
            height: 8,
            radius: 4,
            fill: cfg.increase ? 'rgb(127, 193, 193)' : 'rgb(220, 124, 125)',
          },
          draggable: true,
          name: 'ratio-box',
        });
        group.addShape('text', {
          attrs: {
            text: `${cfg.ratio}%`,
            fill: 'rgba(255, 255, 255, 0.85)',
            fontSize: 6,
            x: 18,
            y: -3,
            textAlign: 'left',
            textBaseline: 'top',
          },
          draggable: true,
          name: 'ratio-shape',
        });
        if (cfg.operator) {
          group.addShape('rect', {
            attrs: {
              x: -8,
              y: 27,
              width: 16,
              height: 16,
              lineWidth: 1,
              stroke: '#aaa',
              lineDash: [2, 1],
              opacity: 0,
            },
            name: 'operator-box',
          });
          group.addShape('circle', {
            attrs: {
              r: 6,
              x: 0,
              y: 35,
              fill: 'rgba(240, 90, 109, 0.15)',
            },
            name: 'operator-circle',
          });
          group.addShape('text', {
            attrs: {
              text: cfg.operator,
              x: 0,
              y: 34,
              fontSize: 12,
              fill: 'rgba(240, 90, 109, 0.85)',
              textAlign: 'center',
              textBaseline: 'middle',
            },
            name: 'operator-symbol',
          });
        }

        // edge end
        group.addShape('line', {
          attrs: {
            x1: -size[0] / 2,
            x2: -size[0] / 2 + 6,
            y1: 0,
            y2: 0,
            lineWidth: 1,
            stroke: 'rgb(19, 33, 92)',
          },
        });
        group.addShape('circle', {
          attrs: {
            r: 2,
            x: -size[0] / 2 + 6,
            y: 0,
            fill: 'rgb(19, 33, 92)',
          },
        });
        return keyShape;
      },
      update: undefined,
    },
    'rect',
  );

  // edge
  G6.registerEdge(
    'round-poly',
    {
      getControlPoints: (cfg) => {
        const { startPoint, endPoint } = cfg;
        return [
          startPoint,
          {
            x: startPoint.x,
            y: endPoint.y,
          },
          endPoint,
        ];
      },
    },
    'polyline',
  );

  // 遍历树
  G6.Util.traverseTree(data, (subtree: any) => {
    if (subtree.level === undefined) subtree.level = 0;
    subtree.children?.forEach((child: any) => (child.level = subtree.level + 1));
    switch (subtree.level) {
      case 0:
        subtree.type = 'root';
        break;
      case 1:
        subtree.type = 'level1node';
        break;
      default:
        subtree.type = 'othernode';
    }
  });

  useEffect(() => {
    const container = document.getElementById('container');
    const width = container?.scrollWidth;
    const height = (container?.scrollHeight || 500) - 30;

    const graph = new G6.TreeGraph({
      container: 'container',
      width,
      height,
      fitView: true,
      layout: {
        type: 'compactBox',
        direction: 'LR',
        getHGap: function getVGap() {
          return 5;
        },
      },
      defaultEdge: {
        type: 'round-poly',
        sourceAnchor: 0,
        targetAnchor: 1,
        style: {
          radius: 8,
          stroke: 'rgb(19, 33, 92)',
        },
      },
      defaultNode: {
        anchorPoints: [
          [0.9, 0.5],
          [0, 0.5],
        ],
      },
      nodeStateStyles: {
        hover: {
          fill: '#fff',
          shadowBlur: 30,
          shadowColor: '#ddd',
        },
        operatorhover: {
          'operator-box': {
            opacity: 1,
          },
        },
      },
      modes: {
        default: ['zoom-canvas', 'drag-canvas', 'collapse-expand'],
      },
    });

    graph.on('node:mouseenter', (e) => {
      if (e.target.get('name')?.includes('operator')) {
        graph.setItemState(e.item!, 'operatorhover', true);
      } else {
        graph.setItemState(e.item!, 'hover', true);
      }
    });
    graph.on('node:mouseleave', (e) => {
      graph.setItemState(e.item!, 'operatorhover', false);
      graph.setItemState(e.item!, 'hover', false);
    });

    graph.data(data);
    graph.render();
  }, []);

  return <div id="container"></div>;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【airsim】python控制airsim

使用airsim 1.8.1编译完成&#xff0c;进过block项目在cpp测试后&#xff0c;开始踩坑使用python。 使用AirSim\PythonClient\setup.py或者pip安装airsim。 python setup.py install或者 pip install airsim此时&#xff0c;windows电脑的环境信息 (air_py38) D:\code\Gith…

JDBC数据库访问——数据库操作

与指定的数据库建立连接后&#xff0c;就可以使用JDBC提供的API对数据库进行操作&#xff0c;包括查询、新增、更新、删除等。 1.查询操作 和数据库建立连接后&#xff0c;对数据库表进行查询操作的步骤如下&#xff1a; ①创建statement对象 由已创建的Connection对象con调…

PID各种算法的基本优缺点

PID时间系数对PID本身的影响 积分时间过小积分作用增强。 微分时间过大&#xff0c;微分控制作用过强&#xff0c;容易产生振荡。 在这里的时间系统&#xff0c;一般指的是采样的时间&#xff0c;也就是PID控制的周期。在无人机当中一般采用10ms控制一次。 一般来说采样周期越小…

【Docker】容器的相关命令

上一篇&#xff1a;创建&#xff0c;查看&#xff0c;进入容器 https://blog.csdn.net/m0_67930426/article/details/135430093?spm1001.2014.3001.5502 目录 1. 关闭容器 2.启动容器 3.删除容器 4.查看容器的信息 查看容器 1. 关闭容器 从图上来看&#xff0c;容器 aa…

如何在 Xftp 中使用自定义编辑器编辑远程服务器文件

1、简介 很多时候我们使用 Xshell 远程登录linux服务器进行文本编辑&#xff0c;通过命令行窗口难以进行快速编辑&#xff0c;因此&#xff0c;借助 Xftp 工具&#xff0c;指定文本编辑器&#xff0c;能够快速帮助我们实现文本编辑。 2、Xftp 使用 在上文中&#xff08;https:…

软件工程概论------文件管理

目录 1.文件的相关概念 2.文件目录 3.位示图 4.索引文件 5.例题 1.文件的相关概念 文件:具有符号名的、在逻辑上具有完整意义的一组相关信息项的集合。 逻辑结构:有结构的记录式文件、无结构的流式文件。 物理结构: 连续结构、链接结构、索引结构、多个物理块的索引表。 …

乔布斯在斯坦福大学经典演讲

今天&#xff0c;很荣幸来到各位从世界上最好的学校之一毕业的毕业典礼上。我从来没从大学毕业过&#xff0c;说实话&#xff0c;这是我离大学毕业最近的一刻。 今天&#xff0c;我只说三个故事&#xff0c;不谈大道理&#xff0c;三个故事就好。 第一个故事&#xff0c;是关于…

【ChatGPT】提示设计的艺术:使用清晰的语法

探索清晰的语法如何使您能够将意图传达给语言模型&#xff0c;并帮助确保输出易于解析 All images were generated by Scott and Marco. 这是与Marco Tulio Ribeiro共同撰写的关于如何使用指导来控制大型语言模型&#xff08;LLM&#xff09;的系列文章的第一部分。我们将从基…

Spring中的工厂类ApplicationContext和BeanFactory

1.ApplicationContext ApplicationContext的实现类&#xff0c;如下图 ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件 FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 Spring 的配置文件 ApplicationContext由BeanFactory派生而…

标签函数 - 打造JavaScript组件

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

计算机基础知识——校验码概述

目录 1 码距 2 奇偶校验 3 CRC循环冗余校验码 3.1 多项式 3.2 编码的组成 3.3 生成多项式 3.4 校验码的生成 4 海明校验码和恒比码 4.1 校验方程 4.2 恒比码 1 码距 码距是恒量一种编码方式的抗错误能力的一个指标。数字信息在传输和存取的过程中&#xff0c;由于…

权威认可!甄知科技猪齿鱼产品荣获信创产品评估证书

近日&#xff0c;依据《信息技术应用创新产品评估规范 第1部分&#xff1a;应用软件》&#xff08;T/SSIA 2001-2022&#xff09;&#xff0c;经过严格评估&#xff0c;甄知科技旗下自主研发的猪齿鱼数智化开发管理平台 V2.0.0&#xff0c;通过信创测试认证&#xff0c;获得上海…

Jmeter相关知识介绍

Jmeter 是Apache 组织开发的基于JAVA 的压力测试工具,用于对软件做压力测试,特别适合于WEB 应用测试(包括压力,接口测试) 今天简单介绍Jemeter的入门相关概念的理解 一、在安装目录下有一个Bin\Jmeter.bat 双击打开 打开之后是一个这样的界面 二、测试计划 1、添加和删…

基础语法(一)(1)

常量和表达式 在这里&#xff0c;我们可以把Python当成一个计算器&#xff0c;来进行一些算术运算 例如&#xff1a; print(1 2 - 3) print(1 2 * 3) print(1 2 / 3)注意&#xff1a; print是一个python内置的函数&#xff0c;这个稍后我们会进行介绍 可以使用-*/&…

java 音乐会售票平台系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 音乐会售票平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助struts2框架开发mvc模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发 环境为TOCAT7.0,Myeclipse8.5开发&#xff0c;数据…

揭开 JavaScript 作用域的神秘面纱(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Halcon计算最小外接矩形Smallest_rectangle2

Halcon计算最小外接矩形Smallest_rectangle2 该算子用于求最小外接矩形。该算子的原型如下&#xff1a; smallest _rectangle2 (Regions : : : Row, Column, Phi, Lengthl, Length2)其各参数的含义如下。 参数1&#xff1a;Regions 表示输入的区域。 参数2和3&#xff1a;Row…

如何通过HACS+Cpolar实现远程控制米家和HomeKit等智能家居设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Assistant。 基本条件…

Spring AI和Ollama

概述 Spring AI 不仅提供了与 OpenAI 进行API交互&#xff0c;同样支持与 Ollama 进行API交互。Ollama 是一个发布在GitHub上的项目&#xff0c;专为运行、创建和分享大型语言模型而设计&#xff0c;可以轻松地在本地启动和运行大型语言模型。 Docker环境安装Ollama 1.获取D…

python 模块搜索路径

前言 当我们import os的时候&#xff0c;Python解释器去哪找os模块呢&#xff1f;如果多处都有os模块&#xff0c;选择哪个os模块呢&#xff1f; 去哪找os模块&#xff1f; Python解释器不是很神奇&#xff0c;它会从以下2个地方找os模块 1、内置模块 sys.builtin_module_nam…