可视化引擎Antv G6初体验


theme: condensed-night-purple
highlight: a11y-dark

什么是G6

G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。旨在让关系变得透明,简单。让用户获得关系数据的 Insight。

类似于D3,D3能实现的G6也能实现,但d3的官方文档是非汉语文档。

第一个示例

搭建环境

最近在看react文档,所以我是在react基础上来学习G6。

npm install --save @antv/g6

导入G6

import G6 from '@antv/g6';

创建容器

在G6进行绘制的时候,会根据id获取对应的节点,将canvas图绘制在这个div中。

<div id="mountNode"></div>

绘制图

参考官网入门
快速上手 | G6 (antgroup.com)

Graph

Graph是G6最主要的一个类,通过graph实例就可以直接绘制图片。里面有两个主要API,data和render。

data 渲染数据

  1. nodes:定义点集
    • x : 横坐标
    1. y : 纵坐标
  2. edges:定义边集
    • source : 开始节点
    1. target : 结束节点
    2. 一个对象表示一条线

graph.render()

根据提供的数据渲染视图。

一些操作记录

graph.setMode(mode)

将事件交互封装在mode中,可以选择默认default和编辑状态。

const graph = new G6.Graph({
    container: div,
    width: 500,
    height: 500,
    modes: {
      default: [...],
      custom: [...]
    }
})
graph.setMode('custom')

内置Behavior —— 与mode搭配使用

参考官网:内置的 Behavior | G6 (antgroup.com)

  1. 拖动节点:drag-node
  2. 缩放:zoom-canvas
  3. 收起和展开:collapse-expand-combo
  4. 拖拽画布:drag-canvas
const graph = new G6.Graph({
    container: 'mountNode', // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身
    width: 800, // Number,必须,图的宽度
    height: 500, // Number,必须,图的高度
    modes: {
        default: [
            'drag-canvas',
            'zoom - canvas'
        ],
    },
});

自定义交互 registerBehavior

参考官网:自定义交互 Behavior | G6 (antgroup.com)

G6.registerBehavior('activate-node',{
    ...
    //返回布局的默认参数
    getDefaultCfg() {
        return {
          multiple: true//是否允许多选,默认为 true?
        };
     },
    //事件绑定
    getEvents() {
        return {
          'node:click': 'onNodeClick',
          'canvas:click': 'onCanvasClick'
        };
     }
     //回调 方法实现
     onNodeClick(e){}
     onCanvasClick(e){}
}

自定义behavior后,使用与内置的相同,都是放在default中。

自定义节点 registerNode

type

在G6中,已经给我们提供了很多内置的节点样式。我们可以在data中对其进行修改。

nodes: [
        {
            id: 'node1', // String,该节点存在则必须,节点的唯一标识
            type: 'rect'
        },
        {
            id: 'node2', // String,该节点存在则必须,节点的唯一标识
            type: 'star'
        },
    ],
创建
G6.registerNode('nodename',{
    option:{
        style:{}
        ...
    }
})

image.png

自定义边 registerEdge

参考官网:自定义边 | G6 (antgroup.com)
注册一个边类型

G6.registerEdge('hvh', {}

继承-line为例

line是已经存在的内置边,如果觉得满足不了需求,又不想重新写一个。就可以选择在line的生命周期上穿插一些事件来满足你的需求。

import G6 from '@antv/g6'; 
G6.registerEdge( 'edgeName', 
{
    draw(cfg, group) { 
         // 定义的其他方法,都可以在draw里面调用, 
         // 如 drawShape、drawLabel 等。 
     },
     drawShape(cfg, group) { // }, 
     getLabelStyle(cfg) { 
         // 根据业务返回 label 的样式 
         return {}; 
     }, 
     update(cfg, item) { 
         // 更新绘制的元素 
     }, 
}, 'line',);

Item 是一个基类

参考官网:元素实例方法 | G6 (antgroup.com)
Node和Edge都会继承与Item上的属性和方法。需了解item的生命周期。

  1. 更新元素:item.update(model)
  2. 刷新元素:item.refresh()
  3. 更新元素位置,避免整体重绘:item.updatePosition(cfg)
  4. 销毁:item.destroy()

Shape

参考官网:图形样式属性 Shape Attr | G6 (antgroup.com)

如何给节点和边绑定事件

其实就是根据事件绑定回调。

参考文档:基础事件 Event | G6 (antgroup.com)

graph.on(eventName, evt => { // 一些操作 })

还可以进行事件的监听

graph.on(timingEventName, evt => { // 一些操作 })

image.png

如何设置节点和边的状态

graph.setItemState(item, stateName, stateValue)

参考文档:状态 State | G6 (antgroup.com)

参数名类型描述
itemNumber需要被设置状态的节点/边实例
stateNameString状态名称,可以是任意字符串
stateValueBooeleantrue 代表该状态是被激活,false 代表该状态被灭活
//定义身体健康状态 
//健康
'bodyState:health': {
    // keyShape 该状态值下的样式
    fill: 'green',
    // ... 其他样式
    // name 为 shape-name1 的子图形在该状态值下的样式
    'shape-name1': {
      stroke: '#ccc'
      // ... 其他样式
    },
    // name 为 shape-name2 的子图形在该状态值下的样式
    'shape-name2': {
      fill: 'red'
      // ... 其他样式
    }
  },
  //
  // 多值状态 bodyState 为 suspect 时的样式
  'bodyState:suspect': {
    // ...
  },
  //生病
  // 多值状态 bodyState 为 ill 时的样式
  'bodyState:ill': {
    // ...
  }
  // ... 其他状态

根据状态查找元素

graph.findAllByState(type, state)

名称类型是否必选描述
typestringtrue元素类型,可选值为 node、edge
statestringtrue状态名称

简单来说就是将item节点的状态(stateName)设置为stateValue,3.4版本之前是只有二值状态的,在这之后就有多值状态了。

// 查询所有选中的元素 
const nodes = graph.findAllByState('node', 'selected');

实战

data.js

  • id: 非必选,内部会自动赋值
  • x:500, y:100 该节点在画布中的位置,

image.png

  • style: 节点样式
  • label: 节点文本
  • labelCfg: 节点文本样式
  • nodeStateStyles: 节点多状态的样式
  • anchorPoints: 自定义锚点数量和位置

自定义行为注册工厂

自定义行为、事件、模式通过一个方法(工厂)去注册。(后续陆续完善)

// register-factory.js 注册工厂函数
import shape from './shape/exports';
import behavior from './behavior/exports';
import registerEdges from './shape/edges/base-edge';
//注册不分先后
export default G6 => {
  // 注册图形
  shape(G6);
  // 注册行为
  behavior(G6);
  // 注册边
  registerEdges(G6);
};

实例化的时候可以选择哪些事件是否开启。(更灵活)

//exports.js 行为暴露 -- 防止全部写在工厂里 显得赘余

import canvasEvent from './canvas-event'; // 画布行为
import selectNode from './select-node'; // 选中节点行为
import deleteItem from './delete-item'; // 删除节点
import activeEdge from './active-edge'; // 激活边
import hoverNode from './hover-node'; // hover节点
import dragNode from './drag-node'; // 拖拽节点

export default G6 => {
  canvasEvent(G6);
  selectNode(G6);
  deleteItem(G6);
  activeEdge(G6);
  hoverNode(G6);
  dragNode(G6);
};

注册行为 behavior:所有的事件

事件一:画布拖拽事件

参考文档:
复合交互及其自定义 Behavior

自定义 Behavior 时,定义事件及处理事件的方法。

触发方式:回调方法 |
'node:click' : 'onNodeClick',

 //BehaviorOption.getEvents()
G6.registerBehavior('behaviorName', {
  getEvents() {
    return {
      'node:click': 'onNodeClick',
      'edge:click': 'onEdgeClick',
      'mousemove': 'onMouseMove'
    }
  }
}
案例:鼠标按下画布时修改cursor

设置触发事件和回调函数名的定义

getEvents () {
            return {
                'canvas:mousemove': 'onCanvasMouseMove',//鼠标在画布内部移动时不断触发,不能通过键盘触发
                'canvas:mousedown': 'onCanvasMouseDown',//鼠标按钮在画布上按下(左键或者右键)时触发,不能通过键盘触发
                'canvas:mouseup': 'onCanvasMouseUp',//画布上按下的鼠标按钮被释放弹起时触发,不能通过键盘触发
                'canvas:dragend': 'onCanvasDragEnd',//当拖拽完成后触发的事件,此事件作用在被拖曳画布上
            };
        },

回调函数的实现

//设置点击鼠标 拖拽时的鼠标样式
        onCanvasMouseMove (e) {
            e.target.get('el').style.cursor = 'grab';
        },
        onCanvasMouseDown (e) {
            console.log(e);
            e.target.get('el').style.cursor = 'grabbing';
        },
        onCanvasMouseUp (e) {
            e.target.get('el').style.cursor = 'grab';
        },
        onCanvasDragEnd (e) {
            e.target.get('el').style.cursor = 'grab';
            this.graph.emit('on-canvas-dragend', e);
        },
this.graph.emit('on-canvas-dragend', e);

事件获取画布相对于渲染时的偏移量。
避免新增了元素时,拖拽进入画布时的位置还是原来的初始值。
即更新画布位置 以保证元素相对画布位置准确。
红色是原来的位置,移动到了右边蓝色的位置,小红框本来放的位置如果不进行处理则会比原来更左一些,因为他是相对画布的位置进行放置。
image.png

参考:

  1. 官网:G6 图可视化引擎
  2. 视频:可视化引擎@antv/g6中级教程(上)
### 回答1: ANTV G6是一款智能电视机顶盒,它不仅可以通过网络观看在线视频,还提供了离线文档的功能。 ANTV G6的离线文档功能允许用户在没有网络连接的情况下访问和浏览本地存储的文档文件。用户可以通过USB接口或者其他存储设备将文档文件导入到G6中,然后在离线状态下查看和编辑这些文档。 离线文档功能使得用户可以在没有网络的情况下继续处理文档工作,提高了工作和学习的效率。无论是在出差、旅行或者没有网络覆盖的地方,用户都可以依靠ANTV G6来查看和编辑文档,保证工作的顺利进行。 ANTV G6不仅支持常见的文档格式,如Word、Excel和PowerPoint,还支持PDF、TXT等多种格式。用户可以通过文件管理系统在G6中浏览并打开各种格式的文件,进行阅读、编辑和保存。 此外,ANTV G6的离线文档功能还提供了一些便捷的操作选项,如快速搜索、书签、阅读模式等。用户可以根据自己的需求和喜好进行设置,提高使用的便捷性和个性化。 总之,ANTV G6的离线文档功能为用户提供了更加便利和灵活的文档处理方式,无论是在有网络的情况下,还是在没有网络的环境中,用户都可以通过G6进行文档工作,提升工作和学习的效率。 ### 回答2: ANTV G6是一款智能电视盒子,它可以通过连接到网络收看各种在线视频内容。但是,ANTV G6也支持离线播放,即使在没有网络连接的情况下,用户也可以通过存储在盒子内部的离线文档来观看内容。 离线文档功能使得用户可以在没有网络时仍然享受丰富的内容。用户可以下载电影、电视剧、纪录片等视频文件,并将其保存在ANTV G6的存储空间内。用户还可以下载各种格式的音乐文件,创建自己的音乐库。此外,用户还可以下载电子书、漫画等文档文件,并通过ANTV G6的离线文档功能进行阅读。 ANTV G6的离线文档功能具有很高的灵活性和可定制性。用户可以根据自己的口味和需求,选择并下载自己喜欢的内容。而且,用户可以通过文件管理器轻松管理和排序这些离线文档,让自己的媒体库更加整洁有序。 总的来说,ANTV G6的离线文档功能为用户提供了便捷的娱乐方式。无论是在没有网络的地方、网络出现故障或者想要隐私地享受内容,用户都可以通过离线文档功能满足自己的需求。ANTV G6的离线文档功能成为用户对于这款智能电视盒子的一个重要选择因素。 ### 回答3: ANTV G6是一款智能电视盒子,它可以连接到电视并提供多种功能。ANTV G6支持离线文档功能,这意味着用户可以在没有网络连接的情况下访问和查阅文档。 离线文档功能非常实用,特别是在没有网络连接或网络不稳定的情况下。用户可以事先下载需要的文档,然后在没有网络时随时打开并查看。这样,即使用户没有互联网,也可以方便地查阅重要资料或文件。 ANTV G6的离线文档功能支持多种文档格式,如PDF、DOC、PPT等常见格式。用户可以通过安装相应的文档阅读器应用程序来打开和阅读这些文档。除了查看文档外,用户还可以进行一些基本的操作,如搜索、添加书签、标注等。 另外,ANTV G6的离线文档功能还提供了快速跳转和目录导航等便捷功能,使得用户能够更方便地浏览和定位到所需的内容。此外,ANTV G6还支持对文档进行分享,用户可以将文档分享给其他设备或其他用户。 总的来说,ANTV G6的离线文档功能为用户提供了便捷的文档访问和查阅体验。无论用户身处何地,只要有ANTV G6,就能够随时打开和浏览各种文件。这对于那些需要频繁查阅文档并且经常处于没有网络连接的环境中的用户来说,无疑是一项非常有用且实用的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值