--- title: 图例 Legend order: 11 --- ## 概述 图例(Legend)插件用于展示图中元素的分类信息,支持节点、边、组合的分类信息展示。通过图例,用户可以快速感知到图中相关元素的分类信息,也可以通过点击对应图例项来快速定位到元素,提高用户的浏览效率。 ## 使用场景 这一插件主要用于: - 通过图例快速对元素进行分类 - 通过图例快速高亮定位到对应元素 ## 基本用法 ```js const data = { nodes: [ { id: 'node-1', type: 'circle', data: { cluster: 'node-type1' } }, { id: 'node-2', type: 'rect', data: { cluster: 'node-type2' } }, ], edges: [{ source: 'node-1', target: 'node-2', data: { cluster: 'edge-type1' } }], }; const graph = new Graph({ data, // 其他配置... plugins: [ { type: 'legend', // 插件类型为 legend nodeField: 'cluster', // 用于节点分组的数组字段名称 edgeField: 'cluster', // 用于边分组的数组字段名称 }, ], }); ``` ## 配置项 | 属性 | 描述 | 类型 | 默认值 | 必选 | | ----------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------ | ---- | | type | 插件类型 | string | `legend` | ✓ | | key | 插件唯一标识符,用于后续更新 | string | - | | | trigger | 图例项触发对应项高亮的方式:
- `hover`:鼠标移入图例项时触发
- `click`:鼠标点击图例项时触发 | `hover` \| `click` | `hover` | | | position | 图例在画布中的相对位置,[可选值](#cardinalplacement) | [CardinalPlacement](#cardinalplacement) | `bottom` | | | container | 图例挂载的容器,无则挂载到 Graph 所在容器 | HTMLElement \| string | - | | | className | 图例画布类名,传入外置容器时不生效 | string | - | | | containerStyle | 图例的容器样式,传入外置容器时不生效 | [CSSStyleDeclaration](https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleDeclaration) | - | | | nodeField | 节点分类标识 | string \| (item: ElementDatum) => string | - | | | edgeField | 边分类标识 | string \| (item: ElementDatum) => string | - | | | comboField | 组合分类标识 | string \| (item: ElementDatum) => string | - | | | orientation | 图例项的布局方向:
- `horizontal`:水平方向
- `vertical`:垂直方向 | `horizontal` \| `vertical` | 'horizontal' | | | layout | 布局方式:
- `flex`:弹性布局
- `grid`:网格布局 | `flex` \| `grid` | `flex` | | | showTitle | 是否显示标题 | boolean | false | | titleText | 标题内容 | string | "" | | x | 图例在画布中的相对的横向位置,优先级高于position | number | - | | | y | 图例在画布中的相对的纵向位置,优先级高于position | number | - | | | width | 图例的宽度 | number | 240 | | | height | 图例的高度 | number | 160 | | | itemSpacing | 图例项的文本和对应标记之间的间距 | number | 4 | | | rowPadding | 图例中每行之间的间距 | number | 10 | | | colPadding | 图例中每列之间的间距 | number | 10 | | | itemMarkerSize | 图例项标记的大小 | number | 16 | | | itemLabelFontSize | 图例项文本的字体大小 | number | 16 | | | gridCol | 图例项在宽度允许情况下的最大列数 | number | - | | | gridRow | 图例项在高度允许情况下的最大行数 | number | - | | ### CardinalPlacement `position` 属性支持以下值: - `'top-left'`:左上角 - `'top-right'`:右上角 - `'bottom-left'`:左下角 - `'bottom-right'`:右下角 - `'left-top'`:左侧靠上 - `'left-bottom'`:左侧靠下 - `'right-top'`:右侧靠上 - `'right-bottom'`:右侧靠下 ## 代码示例 ### 基础图例 ```js const data = { nodes: [ { id: 'node-1', type: 'circle', data: { cluster: 'node-type1' } }, { id: 'node-2', type: 'rect', data: { cluster: 'node-type2' } }, ], edges: [{ source: 'node-1', target: 'node-2', data: { cluster: 'edge-type1' } }], }; const graph = new Graph({ // 其他配置... plugins: [ { type: 'legend', // 插件类型为 legend nodeField: 'cluster', // 用于节点分组的数组字段名称 edgeField: 'cluster', // 用于边分组的数组字段名称 }, ], }); ``` ### 自定义图例位置 ```js const data = { nodes: [ { id: 'node-1', type: 'circle', data: { cluster: 'node-type1' } }, { id: 'node-2', type: 'rect', data: { cluster: 'node-type2' } }, ], edges: [{ source: 'node-1', target: 'node-2', data: { cluster: 'edge-type1' } }], }; const graph = new Graph({ data, // 其他配置... plugins: [ { type: 'legend', nodeField: 'cluster', edgeField: 'cluster', // 可以通过 position 快捷的来指定位置 // position: "top-left", // 也可以通过x,y来更加灵活的控制图例的位置 x: 20, y: 20, }, ], }); ``` ### 自定义图例项布局 ```js const data = { nodes: [ { id: 'node-1', type: 'circle', data: { cluster: 'node-type1' } }, { id: 'node-2', type: 'rect', data: { cluster: 'node-type2' } }, ], edges: [{ source: 'node-1', target: 'node-2', data: { cluster: 'edge-type1' } }], }; const graph = new Graph({ data, // 其他配置... plugins: [ { type: 'legend', nodeField: 'cluster', edgeField: 'cluster', layout: 'flex', // 控制只显示一行 gridRow: 1, // 控制一行显示10列,当列宽不足时会显示翻页按钮 gridCol: 10, }, ], }); ``` ## 常见问题 ### 1. 设置了 orientation 无效? `orientation`主要控制布局的方向,具体展示**一行多列**还是**一列多行**,主要通过 `gridRow` 以及`gridCol`来控制,例如想要看起来像是竖向的图例项,则可以通过这样配置: ```js plugins: [ { type: 'legend', nodeField: 'cluster', edgeField: 'cluster', layout: "flex", // 控制一行显示1列 gridCol:1, // 控制显示最多20行 gridRow: 20, }, ], ``` 这样就变成了只有一列的图例,符合视觉上的竖向排列。 ### 2. 如何动态更新工具栏? 可以使用 `updatePlugin` 方法动态更新工具栏: ```js const graph = new Graph({ data, // 其他配置... plugins: [ { type: 'legend', key: 'my-legend', nodeField: 'cluster', edgeField: 'cluster', }, ], }); // 更新图例位置 graph.updatePlugin({ key: 'my-legend', position: 'bottom-right', }); ``` ## 实际案例 ```js | ob { inject: true } import { Graph } from '@antv/g6'; const data = { nodes: [ { id: 'node-1', type: 'circle', data: { cluster: 'node-type1' } }, { id: 'node-2', type: 'rect', data: { cluster: 'node-type2' } }, { id: 'node-3', type: 'triangle', data: { cluster: 'node-type3' } }, { id: 'node-4', type: 'diamond', data: { cluster: 'node-type4' } }, ], edges: [ { source: 'node-1', target: 'node-2', data: { cluster: 'edge-type1' } }, { source: 'node-1', target: 'node-4', data: { cluster: 'edge-type2' } }, { source: 'node-3', target: 'node-4' }, { source: 'node-2', target: 'node-4', data: { cluster: 'edge-type3' } }, ], }; const graph = new Graph({ container: 'container', data, node: { style: { size: 32 }, palette: { field: 'cluster', }, }, layout: { type: 'force', }, plugins: [ { type: 'legend', nodeField: 'cluster', edgeField: 'cluster', }, ], }); graph.render(); ```