节点分组 Group

Feature 自 G6 3.1.2 开始支持自定义节点分组的标题了,可以渲染带有标题的分组。

对于熟悉图可视化类库的用户来说,节点分组可能是比较实用的一个功能。自 G6 3.0.5 版本开始,G6 加入了节点分组的功能,详情参考Demo节点分组 Group - 图1

数据结构

新增节点分组功能时,尽量保持了 G6 数据结构的稳定性。为了体现分组的特性,我们在 nodes 数据项中加入了 groupId 属性,另外新增了 groups 字段,用于表示数据中所包括的分组及各分组之间的层级关系。

当 groups 中的对象包括 title 属性字段时,表示要渲染带有标题的分组,title 字段的类型可以是 string 或 object:

  • title:类型为 string 时,值表示标题名称,不能设置任何样式,也不能调整标题位置;
  • title 为 object 时,可以设置标题的样式及位置,title 中各字段含义:

    • text:必选,分组的标题,类型为 string;
    • offsetX:可选,默认为 0,表示 x 方向上的偏移量;
    • offsetY:可选,默认为 0,表示 y 方向上的偏移量;
    • stroke:字体边框颜色,同时也支持 fill、fontSize 等所有的文本样式属性
  1. {
  2. nodes: [
  3. {
  4. id: 'node1',
  5. label: 'node1',
  6. groupId: 'group1',
  7. x: 100,
  8. y: 100
  9. },
  10. {
  11. id: 'node2',
  12. label: 'node2',
  13. groupId: 'group1',
  14. x: 150,
  15. y: 100
  16. },
  17. {
  18. id: 'node3',
  19. label: 'node3',
  20. groupId: 'group2',
  21. x: 300,
  22. y: 100
  23. },
  24. ],
  25. edges: [
  26. {
  27. source: 'node1',
  28. target: 'node2'
  29. }
  30. ],
  31. groups: [
  32. {
  33. id: 'group1',
  34. title: {
  35. text: '第一个分组',
  36. stroke: '#444',
  37. offsetX: 0,
  38. offsetY: 0
  39. },
  40. parentId: 'p1'
  41. },
  42. {
  43. id: 'group2',
  44. parentId: 'p1'
  45. },
  46. {
  47. id: 'p1'
  48. }
  49. ]
  50. }

如何渲染 group

当 nodes 中存在 groupId 属性字段时,在渲染过程中,G6 就会自动去渲染分组,当存在 groups 属性时,G6 就会自定去判断各分组之间的层级关系,并渲染出嵌套的分组。但当没有使用任何布局的时候,需要在 nodes 中指定各个阶段的坐标信息,即阶段的 xy 属性值。

  1. const data = {
  2. nodes: [
  3. {
  4. id: 'node6',
  5. groupId: 'group3',
  6. label: 'rect',
  7. x: 100,
  8. y: 300,
  9. },
  10. {
  11. id: 'node1',
  12. label: 'fck',
  13. groupId: 'group1',
  14. x: 100,
  15. y: 100,
  16. },
  17. {
  18. id: 'node9',
  19. label: 'noGroup1',
  20. groupId: 'p1',
  21. x: 300,
  22. y: 210,
  23. },
  24. {
  25. id: 'node2',
  26. label: 'node2',
  27. groupId: 'group1',
  28. x: 150,
  29. y: 200,
  30. },
  31. {
  32. id: 'node3',
  33. label: 'node3',
  34. groupId: 'group2',
  35. x: 300,
  36. y: 100,
  37. },
  38. {
  39. id: 'node7',
  40. groupId: 'p1',
  41. label: 'node7-p1',
  42. x: 200,
  43. y: 200,
  44. },
  45. {
  46. id: 'node10',
  47. label: 'noGroup',
  48. groupId: 'p2',
  49. x: 300,
  50. y: 210,
  51. },
  52. ],
  53. edges: [
  54. {
  55. source: 'node1',
  56. target: 'node2',
  57. },
  58. {
  59. source: 'node2',
  60. target: 'node3',
  61. },
  62. ],
  63. groups: [
  64. {
  65. id: 'group1',
  66. title: {
  67. text: '第一个分组',
  68. stroke: '#444',
  69. offsetX: -30,
  70. offsetY: 30,
  71. },
  72. parentId: 'p1',
  73. },
  74. {
  75. id: 'group2',
  76. parentId: 'p1',
  77. },
  78. {
  79. id: 'group3',
  80. parentId: 'p2',
  81. },
  82. {
  83. id: 'p1',
  84. },
  85. {
  86. id: 'p2',
  87. },
  88. ],
  89. };
  90. const graph = new G6.Graph({
  91. container: 'mountNode',
  92. width: 800,
  93. height: 600,
  94. pixelRatio: 2,
  95. modes: {
  96. default: ['drag-canvas'],
  97. },
  98. defaultNode: {
  99. shape: 'circleNode',
  100. },
  101. defaultEdge: {
  102. color: '#bae7ff',
  103. },
  104. });
  105. graph.data(data);
  106. graph.render();

渲染的效果如下图所示:节点分组 Group - 图2此时,不能对分组中的节点及分组进行任何操作,接下来,我们介绍可以对分组进行的各种操作。

操作分组

只是简单地将分组渲染出来,并没有多大的实用价值,只有支持一系列的交互操作后,才能最大程度地体现分组的价值。

在 G6 中,我们内置了 drag-groupcollapse-expand-groupdrag-node-with-group 三个Behavior,共支持以下的交互行为:

  • 拖动分组;
  • 通过拖拽,动态改变分组中的节点数量及分组大小;
  • 将一个分组从父分组中拖拽出来,并取消分组直接的关联关系,动态改变父分组的大小;
  • 双击分组,收起和展开分组:

    • 当收起分组后,与分组节点中的连线会自动连到分组上;
    • 展开分组后,恢复之前的连接和位置。
  • 拖动节点,所在的分组高亮,当拖到其他分组时,其他分组高亮;
  • [暂不支持] 将分组拖入到另外个分组,并改变分组层级的所属关系

drag-group

drag-group Behavior,支持拖动分组,拖动分组过程中,会动态改变分组中节点和边的位置,在拖拽完成以后,保持分组和节点的相对位置不变。

collapse-expand-group

collapse-expand-group Behavior,支持双击分组收起和展开分组,收起分组以后,隐藏分组中的所有节点,外部节点和分组中节点有连线的情况下,所有连接会连接到分组上面。

优化目前只支持双击交互,正式发布时,会支持用户自定义交互方式,来实现分组的收起和展开。

drag-node-with-group

drag-node-with-group Behavior 和 drag-node 类似,但该 Behavior 仅用于用 group 时 node 的拖拽。拖拽 node 过程中,会动态改变 node 所在的分组。

优化目前暂不支持将多个节点拖出拖入到分组中。

  1. const graph = new G6.Graph({
  2. container: 'mountNode',
  3. width: 800,
  4. height: 600,
  5. pixelRatio: 2,
  6. modes: {
  7. default: ['drag-group', 'collapse-expand-group', 'drag- node-with-group'],
  8. },
  9. defaultNode: {
  10. shape: 'circleNode',
  11. },
  12. defaultEdge: {
  13. color: '#bae7ff',
  14. },
  15. });

将这三个内置提供的 Behavior 加入到 modes 中以后的效果如下图所示。 节点分组 Group - 图3

适用的场景

  • 风控、反洗钱、保险骗保、网络诈骗、信用卡诈骗等场景下团伙分析;
  • 特征分析:同一个分组中的节点在某些特征上面比较相似;
  • 整理节点:当类似的节点放到一个分组中,只渲染分组,不渲染节点,减少干扰元素。