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

news2024/9/24 5:26:31

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>;
}

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

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

相关文章

机器视觉兄弟们,没有项目订单,机器视觉项目行业难题来了

产品没一个正形&#xff0c;光源像是打了几十年的光棍一样&#xff0c;偏偏配不上&#xff0c;n次“相亲”之后图像硬是“阴晴圆缺”&#xff0c;老板阴阳怪气你这打不出来&#xff0c;给客户看之后说&#xff0c;这都打不出来&#xff0c;你们不行啊。 我听了后真想&#xff…

字节填充与0比特填充以及数据链路的基本问题

目录 字节填充&#xff1a; 比特填充&#xff1a; 数据链路有三个基本问题 1.封装成帧 2.透明传输 3.差错检测 首先介绍一下PPP的帧结构&#xff1a; 首部的第一个字段和尾部的第二个字段都是标志字段F(Flag)&#xff0c;规定为0x7E (符号“0x”表示它后面的字符是用十六…

Android低功耗蓝牙开发总结

基础使用 权限申请 蓝牙权限在各个版本中略有不同 Android 12 及以上版本&#xff0c;如果不需要通过蓝牙来推断位置的话&#xff0c;蓝牙扫描不需要开启位置权Android 11 及以下版本&#xff0c;蓝牙扫描必须开启位置权限Android 9 及以下版本&#xff0c;蓝牙扫描可开启粗…

弧形导轨和直线导轨的区别

弧形导轨和直线导轨是两种常见的导轨类型&#xff0c;都具有支撑和引导功能&#xff0c;都可以将运动的能量传递到接收端&#xff0c;实现稳定的运动。那么这两者有什么区别呢&#xff1f; 从结构上来看&#xff0c;直线导轨呈现直线的形状&#xff0c;在机器设备的运动中起到了…

Java学习苦旅(十八)——详解Java中的二叉树

本篇博客将详细讲解二叉树 文章目录 树型结构简介基本概念表示形式 二叉树概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的简单创建二叉树的遍历前中后序遍历层序遍历 结尾 树型结构 简介 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09…

Pytest——Fixture夹具的使用

一、什么是Fixture 在测试开展的过程中&#xff0c;会需要考虑到测试前的准备工作&#xff0c;以及测试后的释放操作行为。这些在Pytest中&#xff0c;会通过Fixture的方式来实现。如果说在运行pytest的测试用例的时候&#xff0c;需要调用一些数据来实现测试行为&#xff0c;…

AJAX(三)跨域

一、同源策略 同源策略最早由Netscape公司提出&#xff0c;是浏览器的一种安全策略。 同源&#xff1a;协议、域名、端口号必须完全相同。&#xff08;同一个来源&#xff09; 违背同源策略就是跨域。 AJAX发送请求时是默认要遵循同源策略的&#xff0c;不是同源策略&#…

Java 如何实现微信支付功能代码示例

微信支付是由中国的腾讯公司推出的一种移动支付方式。它允许用户通过在微信应用中绑定银行卡或其他支付方式来进行交易&#xff0c;包括在线购物、转账、付款码支付等。微信支付的特点包括便捷、安全、快速和全面&#xff0c;使用户可以随时随地完成交易。用户可以通过扫描商家…

QT自定义信号和槽

信号和槽 介绍实现创建文件对teacher的h和cpp文件进行处理对student的h和cpp文件进行处理对widget的h和cpp文件进行处理 介绍 Qt中的信号和槽是一种强大的机制&#xff0c;用于处理对象之间的通信。它们是Qt框架中实现事件驱动编程的核心部分。 信号&#xff08;Signal&#x…

48种国内外的PCB设计工具-你知道的有哪几种呢?

针对强迫症&#xff0c;非要使用最好最全的工具&#xff1b;针对死较真&#xff0c;认为自己的工具最好用&#xff1b; 工具只是工具&#xff0c;思想最重要&#xff01; 自记录&#xff1a; 无论我们设计什么样的项目&#xff0c;电子工程师都必须知道电路应该如何布局以及…

使用mysql查询当天、近一周、近一个月及近一年的数据以及各种报表查询sql

1.mysql查询当天的数据 1 select * from table where to_days(时间字段) to_days(now()); 2.mysql查询昨天的数据 1 select * from table where to_days(now( ) ) - to_days( 时间字段名) < 1 3.mysql查询近一个月的数据 1 SELECT * FROM table WHERE date(时间字段) …

Idea连接Docker在本地(Windows)开发SpringBoot

文章目录 1. 新建运行配置2. 修改运行目标3. 设置新目标Docker4. 选择运行主类5. 运行 当一些需要的服务在docker容器中运行时&#xff0c;因为docker网络等种种原因&#xff0c;不得不把在idea开发的springboot项目放到docker容器中才能做测试或者运行。 1. 新建运行配置 2. …

开启Android学习之旅-3-Android Activity

Android Activity 本文总结《第一行代码 Android》第3版的内容 环境&#xff1a; Android Studio Giraffe | 2022.3.1 Patch 3 Activity 是什么&#xff1f; Activity 简单将就是UI界面&#xff0c;包含两部分 Activity 类 和应用布局文件&#xff0c;如果是 Compose 则另说&…

kubernetes(一)概述与架构

云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes 更新&#xff1a;移除 Dockershim 的常见问题 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p26 1.概述 概述 | Kubernetes 大规模容器编排系统 kubernetes具有以下特性&#xf…

【数值分析】非线性方程求根,牛顿法,牛顿下山法,matlab实现

4. 牛顿法 收敛时牛顿法的收敛速度是二阶的&#xff0c;不低于二阶。如果函数有重根&#xff0c;牛顿法一般不是二阶收敛的。 x k 1 x k − f ( x k ) f ′ ( x k ) x_{k1}x_k- \frac{f(x_k)}{f(x_k)} xk1​xk​−f′(xk​)f(xk​)​ matlab实现 %% 牛顿迭代例子 f (x) x…

x-cmd pkg | gh - GitHub 官方 CLI

目录 简介首次用户功能特点与 x-cmd gh 模块的关系相关作品进一步探索 简介 gh&#xff0c;是由 GitHub 官方使用 Go 语言开发和维护的命令行工具&#xff0c;旨在脚本或是命令行中便捷管理和操作 GitHub 的工作流程。 注意: 由于 x-cmd 提供了同名模块&#xff0c;因此使用官…

机器视觉系统选型-环境配置:报错序列不包含任何元素 的解决方法

描述 环境&#xff1a;VM4.0.0VS2015 及以上 现象&#xff1a;配置环境后&#xff0c;获取线线测量模块结果&#xff0c;报错“序列不包含任何元素”。如下图所示&#xff1a; 解答 将“\VisionMaster4.0.0\Development\V4.0.0 \ComControls\bin\x64”下整体重新拷贝。

StreamPark + PiflowX 打造新一代大数据计算处理平台

&#x1f680; 什么是PiflowX PiFlow 是一个基于分布式计算框架 Spark 开发的大数据流水线系统。该系统将数据的采集、清洗、计算、存储等各个环节封装成组件&#xff0c;以所见即所得方式进行流水线配置。简单易用&#xff0c;功能强大。它具有如下特性&#xff1a; 简单易用…

在云服务器ECS上用Python写一个搜索引擎

在云服务器ECS上用Python写一个搜索引擎 一、场景介绍二、搜索引擎的组成2.1 网页的爬取及排序2.2 用户使用搜索引擎进行搜索 三、操作步骤3.1 环境准备3.2 安装Anaconda3.3 安装Streamlit3.4 下载搜索引擎代码3.5 运行搜索引擎 四、常见问题4.1 运行setup.py时可能的问题4.2 如…

oracle 补齐数字长度 to_char踩坑

oracle的to_char网上找到的说明如下 &#xff08;1&#xff09;用作日期转换&#xff1a; to_char(date,格式); select to_date(2005-01-01 ,yyyy-MM-dd) from dual; select to_char(sysdate,yyyy-MM-dd HH24:mi:ss) from dual; &#xff08;2&#xff09;处理数字&#xf…