资讯专栏INFORMATION COLUMN

初见 g6 图表库

LittleLiByte / 3158人阅读

摘要:准备好数据节点节点节点坐标节点坐标边节点,从哪里出发节点,到哪里结束初始化对象容器渲染位置,表示渲染到图表的中间位置画布高渲染数据这是渲染出来的效果。链接线会以元素为基准。绘制元素时,需要在初始化对象的时候,指定。

hello world
// 1. 准备好数据
// node(节点)
let nodes = [
    {
        id: 1, // 节点 id
        x: 0, // 节点 x 坐标
        y: 0 // 节点 y 坐标
    },
    { id: 2, x: 100, y: 0 }
]
// edge(边)
let edges = [
    {
        source: "2", // 节点 id,从哪里出发
        target: "1" // 节点 id,到哪里结束
    }
]

// 2. 初始化对象
let g6 = new G6.Graph({
  container: "container", // 容器 id
  fitView: "cc", // 渲染位置,cc 表示渲染到图表的中间位置(center center)
  height: window.innerHeight // 画布高
})

// 3. 渲染数据
g6.read({ edges, nodes })

这是渲染出来的效果。Demo源码, 官方文档。

自定义节点

可以看到默认的节点是一个蓝色的圈,如果要想改变节点的样子,就需要用到自定义节点。

// 1. 准备好数据
// node(节点)
let nodes = [
    {
        id: 1, // 节点 id
        x: 0, // 节点 x 坐标
        y: 0, // 节点 y 坐标
        name: "张三" // 自定义数据
    },
    {
        id: 2,
        x: 100,
        y: 0,
        name: "李四" // 自定义数据
    }
]
// edge(边)
let edges = [
    {
        source: "2", // 节点 id,从哪里出发
        target: "1" // 节点 id,到哪里结束
    }
]

// 2. 初始化对象
let g6 = new G6.Graph({
    container: "container", // 容器 id
    renderer: "svg",
    fitView: "cc", // 渲染位置,cc 表示渲染到图表的中间位置(center center)
    height: window.innerHeight // 画布高
})

// 3. 注册节点
G6.registerNode("rect", {
    draw (item) {
        const group = item.getGraphicGroup()
        const model = item.getModel()
        let size = 50    
        let center = size / 2
        
        // 绘制文本节点
        let rect = group.addShape("rect", {
            attrs: {
                x: 0,
                y: 0,
                width: size,
                height: size,
                fill: "#6cf"
            }
        })
        
        // 绘制圆形
        let circle = group.addShape("circle", {
            attrs: {
                x: center,
                y: center,
                r: center,
                fill: "#ffffd",
                stroke: "#f06"
            }
        })
        
        // 绘制文本节点
        let text = group.addShape("text", {
            attrs: {
                x: 0,
                y: 0,
                fontSize: 20,
                fill: "#000",
                stroke: "orange",
                text: `id:${model.id}`
            }
        })
        
        // 绘制 dom 元素
        let dom = group.addShape("dom", {
            attrs: {
                x: 0,
                y: 0,
                width: size,
                height: size,
                html: `
你好呀${model.name},你好呀${model.name}
` } }) return group } }) // 4. 使用节点 g6.node({ shape: "rect" }) // 5. 渲染数据 g6.read({ edges, nodes })

下图是渲染出来的效果。Demo源码,官方文档。

自定义节点的时候有以下现象:

添加 shape 有先后顺序,后面会覆盖前面的。像是 dom 的 z-index

添加 text 节点的时候,其它 shape 会避让。同样坐标设置的都是 [0, 0],文字会渲染在顶部。

链接线会以 return 元素为基准。如果 return text,线会连在 text 节点那里;如果 return group,就是整体的中间。

model 里可以取出定义 node 的时候的其它数据,比如例子里的 name。

绘制的元素大小指定后,超出的部分会被裁切,比如例子里的 dom。

绘制 dom 元素时,需要在初始化对象的时候,指定 new G6.Graph({ renderer: "svg" })

自定义边

自定义边的使用方法跟自定义节点的使用方式类似。

// 1. 准备好数据
// node(节点)
let nodes = [
    { id: 1, x: 0, y: 0 },
    { id: 2, x: 100, y: 0 },
    { id: 3, x: 100, y: 50 }
]
// edge(边)
let edges = [
    {
        source: 1, // 节点 id,从哪里出发
        target: 2 // 节点 id,到哪里结束
    },
    {
        source: 1, // 节点 id,从哪里出发
        target: 3 // 节点 id,到哪里结束
    }
]

// 2. 初始化对象
let g6 = new G6.Graph({
    container: "container", // 容器 id
    fitView: "cc", // 渲染位置,cc 表示渲染到图表的中间位置(center center)
    height: window.innerHeight // 画布高
})

// 3. 自定义边
G6.registerEdge("line", {
    // 路径
    getPath (item) {
        const points = item.getPoints()
        const start = points[0]
        const end = points[points.length - 1]
        return [
          [ "M", start.x, start.y ],
          [ "L", end.x, end.y ]
        ]
    },
    // 起始(圆形)箭头
    startArrow: {
        path () {
            const r = 5
            const x = -5
            const y = 0
            return [
                [ "M", x, y - r ],
                [ "a", r, r, 0, 1, 1, 0, 2 * r ],
                [ "a", r, r, 0, 1, 1, 0, -2 * r ],
                [ "z" ]
            ]
        },
        shorten () {
            return 10
        },
        style (item) {
            const keyShape = item.getKeyShape()
            const { strokeOpacity, stroke } = keyShape.attr()
            return {
                fillOpacity: strokeOpacity,
                fill: "#fff",
                stroke
            }
        }
    }
})

// 4. 使用边
g6.edge({
    shape: "line",
    startArrow: true, // 添加头部箭头
    color: "red",
    endArrow: true // 添加尾部箭头
})

// 5. 渲染数据
g6.read({ edges, nodes })

这是渲染出来的效果。Demo源码,官方文档。

自定义节边的时候有以下现象:

自带的边是有透明度灰色的线。

设置 { endArrow: true } 之后就会在结束点加上箭头。

颜色可以直接设置 color,也可以是同 style 绘制。

添加事件
// 1. 准备好数据
// node(节点)
let nodes = [
    { id: 1, x: 0, y: 0 },
    { id: 2, x: 100, y: 0 },
    { id: 3, x: 100, y: 50 }
]
// edge(边)
let edges = [
    {
        source: 1, // 节点 id,从哪里出发
        target: 2 // 节点 id,到哪里结束
    },
    {
        source: 1, // 节点 id,从哪里出发
        target: 3 // 节点 id,到哪里结束
    }
]

// 2. 初始化对象
let g6 = new G6.Graph({
    container: "container", // 容器 id
    fitView: "cc", // 渲染位置,cc 表示渲染到图表的中间位置(center center)
    height: window.innerHeight // 画布高
})

// 3. 添加事件监听
g6.on("node:click", (e) => {
    const { item } = e
    const { id, x, y } = item.getModel()
    alert(`id:${id}, x:${x}, y:${y}`)
})

// 4. 渲染数据
g6.read({ edges, nodes })

事件的监听是组合的,组合方式就是 [对象]:[事件],"node","edge","group", "guide",都可以自由组合使用,如 node:click, edge:dbclick。
Demo源码,官方文档。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102950.html

相关文章

  • antV G6流程图在Vue中的使用

    原文首发于我的博客,欢迎点击查看获得更好的阅读体验~ 更新内容 最新版本 请关注G6官方的github仓库https://github.com/antvis/g6 2.x版本后,可以通过npm install直接安装使用了 相关资源下载 antV G6( v1.2.8) 字体图标 最近我司项目中需要加入流程图制作功能,于是乎百度各种找可视化绘制拓扑图的轮子,大部分都是国外的,看...

    cnio 评论0 收藏0
  • antV G6流程图在Vue中的使用

    原文首发于我的博客,欢迎点击查看获得更好的阅读体验~ 更新内容 最新版本 请关注G6官方的github仓库https://github.com/antvis/g6 2.x版本后,可以通过npm install直接安装使用了 相关资源下载 antV G6( v1.2.8) 字体图标 最近我司项目中需要加入流程图制作功能,于是乎百度各种找可视化绘制拓扑图的轮子,大部分都是国外的,看...

    张宪坤 评论0 收藏0
  • [BizCharts学习笔记] --- 数据可视化

    摘要:所以笔者选择了,为什么会选择一是因为它是阿里出品,经历了一年左右的打磨已经完全适应在使用其次是它支持自由定制,不会像那样高度封装,所以在开发复杂图表的时候会更加得心应手。只是阿里图表库中的一员。 实际上,在数据可视化这一块笔者并没有很多的开发经历和经验,不过正是因为这个问题笔者才决定学习一门数据可视化框架来弥补自己在这一方面的不足。在这个大数据统治的时代,数据能给我们提供前所未有的便捷...

    CoffeX 评论0 收藏0
  • 蚂蚁金服可视化图形语法 G2 3.3 发布:琢·磨

    摘要:更好的阅读体验,请移步语雀是蚂蚁金服数据可视化解决方案的一个子产品,是一套数据驱动的高交互的可视化图形语法。欢迎共建是一套数据驱动的高交互的可视化图形语法。 showImg(https://segmentfault.com/img/remote/1460000016710544); 更好的阅读体验,请移步语雀 G2 是蚂蚁金服数据可视化解决方案 AntV 的一个子产品,是一套数据驱动的...

    TZLLOG 评论0 收藏0

发表评论

0条评论

LittleLiByte

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<