logo

G2

  • 文档
  • 图表介绍
  • API
  • 图表示例
  • 主题
  • 周边生态
  • 所有产品antv logo arrow
  • 5.3.3
  • 快速上手
  • 简介
    • 什么是 G2
    • 在前端框架中使用
    • Spec 和 API
  • 核心概念
    • 图表(Chart)
      • G2 图表组成
      • 如何使用图表
    • 标记(Mark)
      • 概览
      • area
      • box
      • boxplot
      • cell
      • chord
      • density
      • gauge
      • heatmap
      • image
      • interval
      • line
      • lineX
      • lineY
      • link
      • liquid
      • sunburst
      • point
      • polygon
      • range
      • rangeX
      • rangeY
      • rect
      • shape
      • text
      • vector
      • wordCloud
    • 视图(View)
    • 数据(Data)
      • 概览
      • custom
      • ema
      • fetch
      • filter
      • fold
      • inline
      • join
      • kde
      • log
      • map
      • pick
      • rename
      • slice
      • sort
      • sortBy
    • 编码(Encode)
    • 比例尺(Scale)
      • 概览
      • band
      • linear
      • log
      • ordinal
      • point
      • quantile
      • quantize
      • sqrt
      • threshold
      • time
      • pow
    • 转换(Transform)
      • 概览
      • bin
      • binX
      • diffY
      • dodgeX
      • flexX
      • group
      • groupColor
      • groupX
      • groupY
      • jitter
      • jitterX
      • jitterY
      • normalizeY
      • pack
      • sample
      • select
      • selectX
      • selectY
      • sortColor
      • sortX
      • sortY
      • stackEnter
      • stackY
      • symmetryY
    • 坐标系(Coordinate)
      • 概览
      • fisheye
      • parallel
      • polar
      • theta
      • transpose
      • radial
      • cartesian3D
      • helix
    • 样式(Style)
    • 动画(Animate)
      • 概览
      • fadeIn
      • fadeOut
      • growInX
      • growInY
      • morphing
      • pathIn
      • scaleInX
      • scaleInY
      • scaleOutX
      • scaleOutY
      • waveIn
      • zoomIn
      • zoomOut
    • 状态(State)
    • 交互(Interaction)
      • 概览
      • brushAxisHighlight
      • brushHighlight
      • brushXHighlight
      • brushYHighlight
      • brushFilter
      • brushXFilter
      • brushYFilter
      • chartIndex
      • elementHighlight
      • elementHighlightByColor
      • elementHighlightByX
      • elementSelect
      • elementSelectByColor
      • elementSelectByX
      • fisheye
      • legendFilter
      • legendHighlight
      • poptip
      • scrollbarFilter
      • sliderFilter
    • 复合(Composition)
      • 概览
      • facetCircle
      • facetRect
      • repeatMatrix
      • spaceFlex
      • spaceLayer
      • timingKeyframe
    • 主题(Theme)
      • 概览
      • academy
      • classic
      • classicDark
    • 事件(Event)
    • 颜色映射(Color)
  • 图表 API
  • 图表组件
    • 标题(Title)
    • 坐标轴(Axis)
    • 图例(Legend)
    • 滚动条(Scrollbar)
    • 缩略轴(Slider)
    • 提示信息(Tooltip)
    • 数据标签(Label)
  • 进阶主题
    • 关系图(Graph)
      • forceGraph
      • pack
      • sankey
      • tree
      • treemap
    • 地图(Geo)
      • geoPath
      • geoView
    • 3D 图表(3D Chart)
      • 绘制 3D 图表
      • point3D
      • line3D
      • interval3D
      • surface3D
    • 插件扩展(Plugin)
      • renderer
      • rough
      • lottie
      • a11y
    • 按需打包
    • 设置纹理
    • 服务端渲染(SSR)
    • Spec 函数表达式支持 (5.3.0 支持)
  • 版本特性
    • 新版本特性
    • v4 升级 v5 指南
  • 常见问题 FAQ

图例(Legend)

上一篇
坐标轴(Axis)
下一篇
滚动条(Scrollbar)

Resources

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

概述

G2 中 图例(Legend) 是图表的辅助元素,使用颜色、大小、形状区分不同的数据类型,用于图表中数据的筛选。可以理解为是非空间通道( color,opacity,size,shape)对应比例尺的可视化,G2 会根据设置图形属性映射以及数据的类型自动生成不同的图例,当一个变量对应了多个图形属性时,G2 会对图例进行合并,以达到精简的目的。

color,opacity,size,shape 这四个非空间通道如果判断接收的参数是数据源的字段时,会自动生成不同的图例:

视觉通道解释
color根据不同的颜色生成图例
opacity根据不同的透明度生成图例
size根据不同的大小生成图例
shape根据不同的形状生成图例

构成元素

legend-overview

使用方式

配置图例有两种方式

第一种,传入 boolean 设置是否显示图例。

({
type: 'interval',
legend: false; // 隐藏所有图例
})
({
type: 'interval',
legend: {color: false}; // 隐藏 color 通道的图例
})

第二种,传入 legendOption 对图例进行整体配置。

({
type: 'interval',
legend: {
color: {},
size: {},
},
});

配置层级

图例可以在 Mark 层级配置。在 G2 中,每个标记(Mark)都有自己的图例。如果标记对应的比例尺是同步的,那么图例也会合并。

({
type: 'interval',
legend: {
color: {},
size: {},
},
});

图例也可以在 View 层级配置。图例具有传递性。视图上声明的图例会传递给 children 声明的标记,如果该标记有对应通道的图例,就合并;否则不影响。

({
type: 'view',
legend: {
color: {},
size: {},
},
});

配置项

G2 中图例分为 连续图例 和 分类图例 两种,由于这两种图例的结构不同,所以配置项也存在差异。

有的配置项作用范围区分分类图例和连续图例: 分类图例连续图例

属性描述类型默认值必选
orientation图例朝向,对于分类图例来说即滚动方向horizontal | verticalhorizontal
position图例的位置top | right | left | bottomtop
layout调整图例的 flex 布局方式layout详见layout
size图例的尺寸number-
width图例的宽度number-
crossPadding图例到图表区域的距离number12
order图例在布局的时候的排序number1
title配置图例的标题title详见title
cols 分类图例指定每行显示的图例项数量,为空时表示列数不受限制number-
colPadding 分类图例指定图例项之间的横向间隔number12
rowPadding 分类图例指定图例项之间的纵向间隔number8
maxRows 分类图例指定图例最大行数number3
maxCols 分类图例指定图例最大列数number3
itemMarker 分类图例配置图例项的图标itemMarker详见itemMarker
itemLabel 分类图例配置图例项的标签文字itemLabel详见itemLabel
itemValue 分类图例配置图例项的值itemValue详见itemValue
itemBackground 分类图例配置图例项的背景itemBackground详见itemBackground
itemWidth 分类图例配置图例项的宽度number-
itemSpan 分类图例配置图例项图标、标签和值的空间划分number | number[][1, 1, 1]
itemSpacing 分类图例配置图例项图标、标签和值之间的间距number | number[][8, 8]
nav 分类图例配置图例的分页器nav详见nav
color 连续图例配置连续图例的色带颜色string[] | d3-interpolate-
block 连续图例连续图例是否按区间显示booleanfalse
type 连续图例配置连续图例的类型size |colorcolor
ribbon 连续图例配置连续图例的色带ribbon详见ribbon
handle 连续图例配置连续图例的滑动手柄handle详见handle
label 连续图例配置连续图例的标签/刻度值label详见label
indicator 连续图例配置连续图例的指示器indicator详见indicator

orientation

optional horizontal | vertical

图例朝向,对于分类图例来说即滚动方向。默认为 horizontal。

position

optional "top" | "right" | "left" | "bottom"

图例的位置。默认为 top。

(() => {
const positionList = ['top', 'right', 'left', 'bottom'];
const positionMap = positionList.map((p) => {
return {
label: p,
value: p,
};
});
const chart = new G2.Chart();
chart.options({
type: 'interval',
data: [
{ name: 'London', 月份: 'Jan.', 月均降雨量: 18.9 },
{ name: 'London', 月份: 'Feb.', 月均降雨量: 28.8 },
{ name: 'London', 月份: 'Mar.', 月均降雨量: 39.3 },
{ name: 'London', 月份: 'Apr.', 月均降雨量: 81.4 },
{ name: 'London', 月份: 'May', 月均降雨量: 47 },
{ name: 'London', 月份: 'Jun.', 月均降雨量: 20.3 },
{ name: 'London', 月份: 'Jul.', 月均降雨量: 24 },
{ name: 'London', 月份: 'Aug.', 月均降雨量: 35.6 },
{ name: 'Berlin', 月份: 'Jan.', 月均降雨量: 12.4 },
{ name: 'Berlin', 月份: 'Feb.', 月均降雨量: 23.2 },
{ name: 'Berlin', 月份: 'Mar.', 月均降雨量: 34.5 },
{ name: 'Berlin', 月份: 'Apr.', 月均降雨量: 99.7 },
{ name: 'Berlin', 月份: 'May', 月均降雨量: 52.6 },
{ name: 'Berlin', 月份: 'Jun.', 月均降雨量: 35.5 },
{ name: 'Berlin', 月份: 'Jul.', 月均降雨量: 37.4 },
{ name: 'Berlin', 月份: 'Aug.', 月均降雨量: 42.4 },
],
encode: { x: '月份', y: '月均降雨量', color: 'name' },
transform: [{ type: 'dodgeX' }],
});
const handleSetPosition = (position) => {
chart.options({
legend: {
color: {
position,
},
},
});
chart.render(); // 重新渲染图表
};
// 插入Position 选择器
const selectorContainer = document.createElement('div');
selectorContainer.textContent = '选择图例位置 ';
const selector = document.createElement('select');
selector.innerHTML = positionMap.map(
(position, index) =>
`<option value="${position.value}" ${index === 0 ? 'selected' : ''}>${
position.label
}</option>`,
);
selector.onchange = (e) => {
handleSetPosition(e.target.value);
};
selectorContainer.appendChild(selector);
const node = chart.getContainer();
node.insertBefore(selectorContainer, node.childNodes[0]);
chart.render();
return node;
})();

layout

LegendLayoutCfg optional

Legend 组件支持调整其在画布中的位置,通过 layout 属性来设置。 目前支持基本的 Flex 布局方式,支持的属性包括: justifyContent, alignItems, flexDirection。LegendLayoutCfg 配置如下:

属性描述类型默认值必选
justifyContent主轴对齐方式flex-start | flex-end | centerflex-start
alignItems交叉轴对齐flex-start | flex-end | centerflex-start
flexDirection主轴方向row | columnposition 为top和bottom的时候为row,其他时候为column

通过配置图例的 position 和 layout ,我们可以很灵活地改变图例的位置。

// 配置一个右侧垂直居中的图例
// 第一步,配置position为right
// 第二步,position为right的时候主轴方向flexDirection默认为column
// 第三步,要实现垂直居中,需要在column方向上对齐方式为center,因为column此时为主轴,所以配置justifyContent为center
({
legend: {
color: {
position: 'right',
layout: {
justifyContent: 'center',
},
},
},
});

尝试一下:

size

number optional

Legend 组件的尺寸。影响组件在交叉轴上的大小,例如水平位置的图例,影响整体高度。手动配置会导致 G2 内部计算逻辑失效,需要自己配置 margin、padding、inset 等大小,详见图表布局。除非需要定制化的场景,否则不建议配置。

width

number optional

Legend 组件的宽度。

crossPadding

number optional

Legend 组件和图表的距离。默认为 12。

order

number optional

Legend 组件在布局的时候的排序。默认为 1。G2 内部的组件都有默认的排序大小,值越小越靠近图表区域,例如 Title 组件的默认排序是 2,就比默认排序为 1 的 Legend 组件更远离图表区域。

title

LegendTitleCfg optional

图例标题配置项。LegendTitleCfg 配置如下:

属性描述类型默认值必选
title关闭标题或设置标题内容false | string连续图例为 true,分类图例为 false
titleSpacing标题到内容区域的间距number | number[]4
titleInset标题文本内边距number | number[]0
titlePosition标题所处位置。可采用简写形式,如i 表示inner,如lt 表示left-toptop | bottom |left |right |left-top |left-bottom |right-top |right-bottom |inner-
titleFontSize标题文字大小number | (datum, index, data) => number12
titleFontFamily标题文字字体string | (datum, index, data) => string-
titleFontWeight标题字体粗细number | (datum, index, data) => numbernormal
titleLineHeight标题文字的行高number | (datum, index, data) => number-
titleTextAlign设置标题文本内容的当前对齐方式center | end | left | right | startstart
titleTextBaseline设置在绘制标题文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
titleFill标题字体颜色string | (datum, index, data) => string#1D2129
titleFillOpacity标题字体颜色透明度number | (datum, index, data) => number0.65
titleStroke标题字体描边颜色string | (datum, index, data) => string-
titleStrokeOpacity标题字体描边颜色透明度number | (datum, index, data) => number-
titleLineWidth标题字体描边的宽度number | (datum, index, data) => number-
titleLineDash标题字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
titleOpacity标题文字的整体透明度number | (datum, index, data) => number-
titleShadowColor标题文字阴影颜色string | (datum, index, data) => string-
titleShadowBlur标题文字阴影的高斯模糊系数number | (datum, index, data) => number-
titleShadowOffsetX设置阴影距标题文字的水平距离number | (datum, index, data) => number-
titleShadowOffsetY设置阴影距标题文字的垂直距离number | (datum, index, data) => number-
titleCursor标题鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault

在 Legend 组件中配置标题的时候,不是以对象的形式来配置,而是以 title前缀加属性的方式来配置。

({
legend: {
size: {
title: '图例标题',
titleSpacing: 0,
titleInset: 0,
titlePosition: 't',
titleFontSize: 16,
titleFontFamily: 'sans-serif',
titleFontWeight: 500,
titleLineHeight: 20,
titleTextAlign: 'center',
titleTextBaseline: 'middle',
titleFill: '#000',
titleFillOpacity: 0.9,
titleStroke: '#DAF5EC',
titleStrokeOpacity: 0.9,
titleLineWidth: 2,
titleLineDash: [4, 8],
titleOpacity: 1,
titleShadowColor: '#d3d3d3',
titleShadowBlur: 10,
titleShadowOffsetX: 10,
titleShadowOffsetY: 10,
titleCursor: 'pointer',
},
},
});

尝试一下:

cols

number optional

适用于 分类图例 。指定每行显示的图例项数量,为空时表示列数不受限制。

图例布局默认采用流式布局。

flow layout

当指定 cols 之后会采用网格布局。

grid layout 1grid layout 2

colPadding

number optional

适用于 分类图例 。指定图例项之间的横向间隔。默认为 12。

rowPadding

number optional

适用于 分类图例 。指定图例项之间的纵向间隔。默认为 8。

maxRows

number optional

适用于 分类图例 。指定图例最大行数。默认为 3。

maxCols

number optional

适用于 分类图例 。指定图例最大列数。默认为 3。

💡 maxRows 和 maxCols 是怎么作用于图例布局的?

maxRows 和 maxCols 用于限制图例布局的最大行数和列数。在代码中通过 getRows = (rows) => Math.min(rows, maxRows)和 getCols = (cols) => Math.min(cols, maxCols)实现行列数限制。

参数垂直布局水平布局
maxCols限制列数,控制图例宽度无直接影响(列数由 cols 参数指定)
maxRows无直接影响(行数由高度自动计算)限制行数,控制图例高度

潜在问题

  • 垂直布局:若 maxCols 过小,可能导致单列行数超过 maxHeight,引发溢出。

  • 水平布局:若 maxRows 过小,部分项可能被截断。

此时需要适当调整图表的 margin 和 padding,保证图例有足够的空间展示。

itemMarker

LegendItemMarkerCfg optional

适用于 分类图例 。配置图例项的图标。LegendItemMarkerCfg 配置如下:

属性描述类型默认值必选
itemMarker图例项图标Symbols |(datum, index, data)=>Symbolscircle
itemMarkerSize图例项图标大小number | (datum, index, data) => number8
itemMarkerFill图例项图标填充色string | (datum, index, data) => string-
itemMarkerFillOpacity图例项图标填充透明度number | (datum, index, data) => number1
itemMarkerStroke图例项图标的描边string | (datum, index, data) => string-
itemMarkerStrokeOpacity图例项图标描边透明度number | (datum, index, data) => number-
itemMarkerLineWidth图例项图标描边的宽度number | (datum, index, data) => number-
itemMarkerLineDash图例项图标描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
itemMarkerOpacity图例项图标的整体透明度number | (datum, index, data) => number-
itemMarkerShadowColor图例项图标阴影颜色string | (datum, index, data) => string-
itemMarkerShadowBlur图例项图标阴影的高斯模糊系数number | (datum, index, data) => number-
itemMarkerShadowOffsetX设置阴影距图例项图标的水平距离number | (datum, index, data) => number-
itemMarkerShadowOffsetY设置阴影距图例项图标的垂直距离number | (datum, index, data) => number-
itemMarkerCursor图例项图标鼠标样式。同 css 的鼠标样式。string | (datum, index, data) => stringdefault

Symbols 可选类型

属性描述
bowtie图形类型:蝴蝶结
cross图形类型:十字
dash图形类型:短横线
diamond图形类型:菱形
dot图形类型:点
hexagon图形类型:六边形
hollowBowtie图形类型:空心蝴蝶结
hollowDiamond图形类型:空心菱形
hollowHexagon图形类型:空心六边形
hollowPoint图形类型:空心点
hollowSquare图形类型:空心正方形
hollowTriangle图形类型:空心三角形
hollowTriangleDown图形类型:倒空心三角形
hv样式类型:HV 路径
hvh样式类型:HVH 路径
hyphen图形类型:连字符
line图形类型:直线
plus图形类型:加号
point图形类型:实心点
rect图形类型:矩形
smooth样式类型:平滑曲线
square图形类型:正方形
tick图形类型:刻度线
triangleDown图形类型:倒三角形
triangle图形类型:三角形
vh样式类型:VH 路径
vhv样式类型:VHV 路径

尝试一下:

(() => {
// 可选的itemMarker形状
const shapeList = [
'bowtie',
'cross',
'dash',
'diamond',
'dot',
'hexagon',
'hollowBowtie',
'hollowDiamond',
'hollowHexagon',
'hollowPoint',
'hollowSquare',
'hollowTriangle',
'hollowTriangleDown',
'hv',
'hvh',
'hyphen',
'line',
'plus',
'point',
'rect',
'smooth',
'square',
'tick',
'triangleDown',
'triangle',
'vh',
'vhv',
];
const shapeMap = shapeList.map((p) => {
return {
label: p,
value: p,
};
});
const chart = new G2.Chart();
chart.options({
type: 'legends',
height: 60,
itemMarker: 'bowtie',
scale: {
color: {
type: 'ordinal',
domain: ['a', 'b'],
range: ['steelblue', 'orange'],
},
},
});
const handleSetShape = (shape) => {
chart.options({
itemMarker: shape,
});
chart.render(); // 重新渲染图表
};
const selectorContainer = document.createElement('div');
selectorContainer.textContent = '选择图例项图标的形状 ';
const selector = document.createElement('select');
selector.innerHTML = shapeMap.map(
(shape, index) =>
`<option value="${shape.value}" ${index === 0 ? 'selected' : ''}>${
shape.label
}</option>`,
);
selector.onchange = (e) => {
handleSetShape(e.target.value);
};
selectorContainer.appendChild(selector);
const node = chart.getContainer();
node.insertBefore(selectorContainer, node.childNodes[0]);
chart.render();
return node;
})();

在 Legend 组件中配置图例项图标的时候,不是以对象的形式来配置,而是以 itemMarker前缀加属性的方式来配置。

({
legend: {
color: {
itemMarker: 'rect',
itemMarkerSize: 20,
itemMarkerFill: '#000',
itemMarkerFillOpacity: 0.9,
itemMarkerStroke: '#DAF5EC',
itemMarkerStrokeOpacity: 0.9,
itemMarkerLineWidth: 2,
itemMarkerLineDash: [4, 8],
itemMarkerOpacity: 1,
itemMarkerShadowColor: '#d3d3d3',
itemMarkerShadowBlur: 10,
itemMarkerShadowOffsetX: 10,
itemMarkerShadowOffsetY: 10,
itemMarkerCursor: 'pointer',
},
},
});

itemLabel

LegendItemLabelCfg optional

适用于 分类图例 。配置图例项的标签。LegendItemLabelCfg 配置如下:

属性描述类型默认值必选
itemLabelText图例项标签内容string | (datum, index, data) => string-
itemLabelFontSize图例项标签文字大小number | (datum, index, data) => number12
itemLabelFontFamily图例项标签文字字体string | (datum, index, data) => string-
itemLabelFontWeight图例项标签字体粗细number | (datum, index, data) => numbernormal
itemLabelLineHeight图例项标签文字的行高number | (datum, index, data) => number-
itemLabelTextAlign设置图例项标签文本内容的当前对齐方式center | end | left | right | startstart
itemLabelTextBaseline设置在绘制图例项标签文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
itemLabelFill图例项标签字体颜色string | (datum, index, data) => string#1D2129
itemLabelFillOpacity图例项标签字体颜色透明度number | (datum, index, data) => number0.9
itemLabelStroke图例项标签字体描边颜色string | (datum, index, data) => string-
itemLabelStrokeOpacity图例项标签字体描边颜色透明度number | (datum, index, data) => number-
itemLabelLineWidth图例项标签字体描边的宽度number | (datum, index, data) => number-
itemLabelLineDash图例项标签字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (da tu m, index, data) => [number , number]-
itemLabelOpacity图例项标签文字的整体透明度number | (datum, index, data) => number-
itemLabelShadowColor图例项标签文字阴影颜色string | (datum, index, data) => string-
itemLabelShadowBlur图例项标签文字阴影的高斯模糊系数number | (datum, index, data) => number-
itemLabelShadowOffsetX设置阴影距图例项标签文字的水平距离number | (datum, index, data) => number-
itemLabelShadowOffsetY设置阴影距图例项标签文字的垂直距离number | (datum, index, data) => number-
itemLabelCursor图例项标签鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault

在 Legend 组件中配置图例项标签的时候,不是以对象的形式来配置,而是以 itemLabel前缀加属性的方式来配置。

({
legend: {
color: {
itemLabelText: '图例项标签',
itemLabelFontSize: 16,
itemLabelFontFamily: 'sans-serif',
itemLabelFontWeight: 500,
itemLabelLineHeight: 20,
itemLabelTextAlign: 'center',
itemLabelTextBaseline: 'middle',
itemLabelFill: '#000',
itemLabelFillOpacity: 0.9,
itemLabelStroke: '#DAF5EC',
itemLabelStrokeOpacity: 0.9,
itemLabelLineWidth: 2,
itemLabelLineDash: [4, 8],
itemLabelOpacity: 1,
itemLabelShadowColor: '#d3d3d3',
itemLabelShadowBlur: 10,
itemLabelShadowOffsetX: 10,
itemLabelShadowOffsetY: 10,
itemLabelCursor: 'pointer',
},
},
});

itemValue

LegendItemValueCfg optional

适用于 分类图例 。配置图例项的值。LegendItemValueCfg 配置如下:

属性描述类型默认值必选
itemValueText图例项值内容string | (datum, index, data) => string-
itemValueFontSize图例项值文字大小number | (datum, index, data) => number12
itemValueFontFamily图例项值文字字体string | (datum, index, data) => string-
itemValueFontWeight图例项值字体粗细number | (datum, index, data) => numbernormal
itemValueLineHeight图例项值文字的行高number | (datum, index, data) => number-
itemValueTextAlign设置图例项值文本内容的当前对齐方式center | end | left | right | startstart
itemValueTextBaseline设置在绘制图例项值文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
itemValueFill图例项值字体颜色string | (datum, index, data) => string#1D2129
itemValueFillOpacity图例项值字体颜色透明度number | (datum, index, data) => number0.65
itemValueStroke图例项值字体描边颜色string | (datum, index, data) => string-
itemValueStrokeOpacity图例项值字体描边颜色透明度number | (datum, index, data) => number-
itemValueLineWidth图例项值字体描边的宽度number | (datum, index, data) => number-
itemValueLineDash图例项值字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
itemValueOpacity图例项值文字的整体透明度number | (datum, index, data) => number-
itemValueShadowColor图例项值文字阴影颜色string | (datum, index, data) => string-
itemValueShadowBlur图例项值文字阴影的高斯模糊系数number | (datum, index, data) => number-
itemValueShadowOffsetX设置阴影距图例项值文字的水平距离number | (datum, index, data) => number-
itemValueShadowOffsetY设置阴影距图例项值文字的垂直距离number | (datum, index, data) => number-
itemValueCursor图例项值鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault

在 Legend 组件中配置图例项值的时候,不是以对象的形式来配置,而是以 itemValue前缀加属性的方式来配置。

({
legend: {
color: {
itemValueText: '图例项值',
itemValueFontSize: 16,
itemValueFontFamily: 'sans-serif',
itemValueFontWeight: 500,
itemValueLineHeight: 20,
itemValueTextAlign: 'center',
itemValueTextBaseline: 'middle',
itemValueFill: '#000',
itemValueFillOpacity: 0.9,
itemValueStroke: '#DAF5EC',
itemValueStrokeOpacity: 0.9,
itemValueLineWidth: 2,
itemValueLineDash: [4, 8],
itemValueOpacity: 1,
itemValueShadowColor: '#d3d3d3',
itemValueShadowBlur: 10,
itemValueShadowOffsetX: 10,
itemValueShadowOffsetY: 10,
itemValueCursor: 'pointer',
},
},
});

itemBackground

LegendItemBackgroundCfg optional

适用于 分类图例 。配置图例项的背景。LegendItemBackgroundCfg 配置如下:

属性描述类型默认值必选
itemBackgroundRadius图例项背景圆角number | (datum, index, data) => number0
itemBackgroundFill图例项背景填充色string | (datum, index, data) => stringtransparent
itemBackgroundFillOpacity图例项背景填充透明度number | (datum, index, data) => number-
itemBackgroundStroke图例项背景的描边string | (datum, index, data) => string-
itemBackgroundStrokeOpacity图例项背景描边透明度number | (datum, index, data) => number-
itemBackgroundLineWidth图例项背景描边的宽度number | (datum, index, data) => number-
itemBackgroundLineDash图例项背景描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
itemBackgroundOpacity图例项背景的整体透明度number | (datum, index, data) => number-
itemBackgroundShadowColor图例项背景阴影颜色string | (datum, index, data) => string-
itemBackgroundShadowBlur图例项背景阴影的高斯模糊系数number | (datum, index, data) => number-
itemBackgroundShadowOffsetX设置阴影距图例项背景的水平距离number | (datum, index, data) => number-
itemBackgroundShadowOffsetY设置阴影距图例项背景的垂直距离number | (datum, index, data) => number-
itemBackgroundCursor图例项背景鼠标样式。同 css 的鼠标样式。string | (datum, index, data) => stringdefault

在 Legend 组件中配置图例项背景的时候,不是以对象的形式来配置,而是以 itemBackground前缀加属性的方式来配置。

({
legend: {
color: {
itemBackgroundRadius: 50,
itemBackgroundFill: '#000',
itemBackgroundFillOpacity: 0.9,
itemBackgroundStroke: '#DAF5EC',
itemBackgroundStrokeOpacity: 0.9,
itemBackgroundLineWidth: 2,
itemBackgroundLineDash: [4, 8],
itemBackgroundOpacity: 1,
itemBackgroundShadowColor: '#d3d3d3',
itemBackgroundShadowBlur: 10,
itemBackgroundShadowOffsetX: 10,
itemBackgroundShadowOffsetY: 10,
itemBackgroundCursor: 'pointer',
},
},
});

接下来,试试结合 itemMarker、itemLabel、itemValue和itemBackground的各种属性,来配置一个自定义的图例吧:

itemWidth

number optional

适用于 分类图例 。配置图例项的宽度。

itemSpan

number|number[] optional

适用于 分类图例 。配置图例项图标、标签和值的空间划分。默认为[1, 1, 1]。

itemSpacing

number|number[] optional

适用于 分类图例 。配置图例项图标、标签和值之间的间距。默认为[8, 8]。

nav

LegendNavCfg optional

适用于 分类图例 。配置图例的分页器。在网格布局下,页面容量 = gridRow × gridCol,如果分类项数量超出此容量,则分页。在弹性布局下,页面容量动态计算,受容器宽度和高度限制。当分类项超过容器高度或宽度时,进行分页,展示分页器组件。LegendNavCfg 配置如下:

legend-nav
属性描述类型默认值必选
navEffect翻页显示效果参见 Web Animations APIlinear
navDuration单次翻页动效时长number200
navOrientation翻页滚动方向
- 横向horizontal
- 纵向vertical
horizontal |verticalhorizontal
navDefaultPage默认展示页数number0
navLoop是否启用循环翻页booleanfalse
navPageWidth分页器页宽number-
navPageHeight分页器页高number-
navControllerPadding分页器按钮与分页器数字的间隔number | number[]5
navControllerSpacing分页器按钮与页的间隔,可以用来配置分页器与图例的间隔number | number[]5
navPageNumFontSize分页器数字文字大小number | (datum, index, data) => number12
navPageNumFontFamily分页器数字文字字体string | (datum, index, data) => string-
navPageNumFontWeight分页器数字字体粗细number | (datum, index, data) => numbernormal
navPageNumLineHeight分页器数字文字的行高number | (datum, index, data) => number-
navPageNumTextAlign设置分页器数字文本内容的当前对齐方式center | end | left | right | startstart
navPageNumTextBaseline设置在绘制分页器数字文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
navPageNumFill分页器数字字体颜色string | (datum, index, data) => string#1D2129
navPageNumFillOpacity分页器数字字体颜色透明度number | (datum, index, data) => number0.45
navPageNumStroke分页器数字字体描边颜色string | (datum, index, data) => string-
navPageNumStrokeOpacity分页器数字字体描边颜色透明度number | (datum, index, data) => number-
navPageNumLineWidth分页器数字字体描边的宽度number | (datum, index, data) => number-
navPageNumLineDash分页器数字字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
navPageNumOpacity分页器数字文字的整体透明度number | (datum, index, data) => number-
navPageNumShadowColor分页器数字文字阴影颜色string | (datum, index, data) => string-
navPageNumShadowBlur分页器数字文字阴影的高斯模糊系数number | (datum, index, data) => number-
navPageNumShadowOffsetX设置阴影距分页器数字文字的水平距离number | (datum, index, data) => number-
navPageNumShadowOffsetY设置阴影距分页器数字文字的垂直距离number | (datum, index, data) => number-
navPageNumCursor分页器数字鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault
navButtonSize分页器按钮尺寸number | (datum, index, data) => number-
navButtonFill分页器按钮填充色string | (datum, index, data) => string#1D2129
navButtonFillOpacity分页器按钮填充透明度number | (datum, index, data) => number0.65
navButtonStroke分页器按钮的描边string | (datum, index, data) => string-
navButtonStrokeOpacity分页器按钮描边透明度number | (datum, index, data) => number-
navButtonLineWidth分页器按钮描边的宽度number | (datum, index, data) => number-
navButtonLineDash分页器按钮描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
navButtonOpacity分页器按钮的整体透明度number | (datum, index, data) => number-
navButtonShadowColor分页器按钮阴影颜色string | (datum, index, data) => string-
navButtonShadowBlur分页器按钮阴影的高斯模糊系数number | (datum, index, data) => number-
navButtonShadowOffsetX设置阴影距分页器按钮的水平距离number | (datum, index, data) => number-
navButtonShadowOffsetY设置阴影距分页器按钮的垂直距离number | (datum, index, data) => number-
navButtonCursor分页器按钮鼠标样式。同 css 的鼠标样式。string | (datum, index, data) => stringdefault
navFormatter页码文本格式化(current: number, total: number) => string-

在 Legend 组件中配置分页器属性的时候,不是以对象的形式来配置,而是以 nav前缀加属性的方式来配置。

({
legend: {
color: {
navEffect: 'cubic-bezier',
navDuration: 400,
navOrientation: 'vertical',
navDefaultPage: 1,
navLoop: true,
navPageWidth: 10,
navPageHeight: 10,
navControllerPadding: 10,
navControllerSpacing: 10,
//配置navPageNum的绘图属性
navPageNumFontSize: 16,
navPageNumFontFamily: 'sans-serif',
navPageNumFontWeight: 500,
navPageNumLineHeight: 20,
navPageNumTextAlign: 'center',
navPageNumTextBaseline: 'middle',
navPageNumFill: '#000',
navPageNumFillOpacity: 0.9,
navPageNumStroke: '#DAF5EC',
navPageNumStrokeOpacity: 0.9,
navPageNumLineWidth: 2,
navPageNumLineDash: [4, 8],
navPageNumOpacity: 1,
navPageNumShadowColor: '#d3d3d3',
navPageNumShadowBlur: 10,
navPageNumShadowOffsetX: 10,
navPageNumShadowOffsetY: 10,
navPageNumCursor: 'pointer',
// 配置navButton的绘图属性
navButtonFill: '#000',
navButtonFillOpacity: 0.9,
navButtonStroke: '#DAF5EC',
navButtonStrokeOpacity: 0.9,
navButtonLineWidth: 2,
navButtonLineDash: [4, 8],
navButtonOpacity: 1,
navButtonShadowColor: '#d3d3d3',
navButtonShadowBlur: 10,
navButtonShadowOffsetX: 10,
navButtonShadowOffsetY: 10,
navButtonCursor: 'pointer',
},
},
});

尝试一下:

color

string[] | d3-interpolate optional

适用于 连续图例 。配置连续图例的色带颜色,为数组时会从中按序取色。

block

boolean optional

适用于 连续图例 。连续图例是否按区间显示。默认为 false。

type

size | color optional

适用于 连续图例 。配置连续图例的类型。默认为 color。

结合 block 和 type 属性可以配置不同样式的连续图例。连续数据的图例具有 4 种样式,分别为:

  • 连续表示 默认

    ribbon-color
  • 范围表示 block=true

    ribbon-color
  • 尺寸表示 type='size'

    ribbon-color
  • 尺寸、范围表示 type='size' block=true

    ribbon-color

ribbon

LegendRibbonCfg optional

适用于 连续图例 。配置连续图例的色带。LegendRibbonCfg 配置如下:

属性描述类型默认值必选
ribbonSize色带大小number | (datum, index, data) => number12
ribbonFill色带填充色string | (datum, index, data) => string#aaa
ribbonFillOpacity色带填充透明度number | (datum, index, data) => number-
ribbonStroke色带的描边string | (datum, index, data) => string-
ribbonStrokeOpacity色带描边透明度number | (datum, index, data) => number-
ribbonLineWidth色带描边的宽度number | (datum, index, data) => number-
ribbonLineDash色带描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
ribbonOpacity色带的整体透明度number | (datum, index, data) => number-
ribbonShadowColor色带阴影颜色string | (datum, index, data) => string-
ribbonShadowBlur色带阴影的高斯模糊系数number | (datum, index, data) => number-
ribbonShadowOffsetX设置阴影距色带的水平距离number | (datum, index, data) => number-
ribbonShadowOffsetY设置阴影距色带的垂直距离number | (datum, index, data) => number-
ribbonCursor色带鼠标样式。同 css 的鼠标样式。string | (datum, index, data) => stringdefault

在 Legend 组件中配置色带的时候,不是以对象的形式来配置,而是以 ribbon前缀加属性的方式来配置。

({
legend: {
color: {
ribbonSize: 20,
ribbonFill: '#000',
ribbonFillOpacity: 0.9,
ribbonStroke: '#DAF5EC',
ribbonStrokeOpacity: 0.9,
ribbonLineWidth: 2,
ribbonLineDash: [4, 8],
ribbonOpacity: 1,
ribbonShadowColor: '#d3d3d3',
ribbonShadowBlur: 10,
ribbonShadowOffsetX: 10,
ribbonShadowOffsetY: 10,
ribbonCursor: 'pointer',
},
},
});

handle

LegendHandleCfg optional

滑动窗口标记了当前的值选取范围,通过与滑动窗口交互能够对视图中的值范围进行选择。

slider-window

适用于 连续图例 。配置连续图例的滑动手柄。 LegendHandleCfg 配置如下:

属性描述类型默认值必选
handle是否显示滑动手柄booleantrue
handleLabel是否显示滑动手柄标签booleanfalse
slidable窗口是否可以滑动booleantrue
range滑动窗口默认选择范围[number, number][min, max]
step单次滑动步长number1
handleLabelFontSize手柄标签文字大小number | (datum, index, data) => number12
handleLabelFontFamily手柄标签文字字体string | (datum, index, data) => string-
handleLabelFontWeight手柄标签字体粗细number | (datum, index, data) => numbernormal
handleLabelLineHeight手柄标签文字的行高number | (datum, index, data) => number-
handleLabelTextAlign设置手柄标签文本内容的当前对齐方式center | end | left | right | startstart
handleLabelTextBaseline设置在绘制手柄标签文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
handleLabelFill手柄标签字体颜色string | (datum, index, data) => string#1D2129
handleLabelFillOpacity手柄标签字体颜色透明度number | (datum, index, data) => number0.45
handleLabelStroke手柄标签字体描边颜色string | (datum, index, data) => string-
handleLabelStrokeOpacity手柄标签字体描边颜色透明度number | (datum, index, data) => number-
handleLabelLineWidth手柄标签字体描边的宽度number | (datum, index, data) => number-
handleLabelLineDash手柄标签字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
handleLabelOpacity手柄标签文字的整体透明度number | (datum, index, data) => number-
handleLabelShadowColor手柄标签文字阴影颜色string | (datum, index, data) => string-
handleLabelShadowBlur手柄标签文字阴影的高斯模糊系数number | (datum, index, data) => number-
handleLabelShadowOffsetX设置阴影距手柄标签文字的水平距离number | (datum, index, data) => number-
handleLabelShadowOffsetY设置阴影距手柄标签文字的垂直距离number | (datum, index, data) => number-
handleLabelCursor手柄标签鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault
handleIconSize手柄图标尺寸色number | (datum, index, data) => number-
handleIconFill手柄图标填充色string | (datum, index, data) => string#1D2129
handleIconFillOpacity手柄图标填充透明度number | (datum, index, data) => number0.65
handleIconStroke手柄图标的描边string | (datum, index, data) => string-
handleIconStrokeOpacity手柄图标描边透明度number | (datum, index, data) => number-
handleIconLineWidth手柄图标描边的宽度number | (datum, index, data) => number-
handleIconLineDash手柄图标描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
handleIconOpacity手柄图标的整体透明度number | (datum, index, data) => number-
handleIconShadowColor手柄图标阴影颜色string | (datum, index, data) => string-
handleIconShadowBlur手柄图标阴影的高斯模糊系数number | (datum, index, data) => number-
handleIconShadowOffsetX设置阴影距手柄图标的水平距离number | (datum, index, data) => number-
handleIconShadowOffsetY设置阴影距手柄图标的垂直距离number | (datum, index, data) => number-
handleIconCursor手柄图标鼠标样式。同 css 的鼠标样式。string | (datum, index, data) => stringdefault

在 Legend 组件中配置连续图例滑动手柄属性的时候,不是以对象的形式来配置,而是以 handle前缀加属性的方式来配置。

({
legend: {
color: {
handle: true,
handleLabel: true,
slidable: true,
range: [0, 1],
step: 1,
//配置handleLabel的绘图属性
handleLabelFontSize: 16,
handleLabelFontFamily: 'sans-serif',
handleLabelFontWeight: 500,
handleLabelLineHeight: 20,
handleLabelTextAlign: 'center',
handleLabelTextBaseline: 'middle',
handleLabelFill: '#000',
handleLabelFillOpacity: 0.9,
handleLabelStroke: '#DAF5EC',
handleLabelStrokeOpacity: 0.9,
handleLabelLineWidth: 2,
handleLabelLineDash: [4, 8],
handleLabelOpacity: 1,
handleLabelShadowColor: '#d3d3d3',
handleLabelShadowBlur: 10,
handleLabelShadowOffsetX: 10,
handleLabelShadowOffsetY: 10,
handleLabelCursor: 'pointer',
handleIconSize: 50,
// 配置handleIcon的绘图属性
handleIconFill: '#000',
handleIconFillOpacity: 0.9,
handleIconStroke: '#DAF5EC',
handleIconStrokeOpacity: 0.9,
handleIconLineWidth: 2,
handleIconLineDash: [4, 8],
handleIconOpacity: 1,
handleIconShadowColor: '#d3d3d3',
handleIconShadowBlur: 10,
handleIconShadowOffsetX: 10,
handleIconShadowOffsetY: 10,
handleIconCursor: 'pointer',
},
},
});

label

LegendLabelCfg optional

适用于 连续图例 。配置连续图例的标签/刻度值。 LegendLabelCfg 配置如下:

属性描述类型默认值必选
label是否显示连续图例的刻度值booleantrue
labelFormatter连续图例的刻度值格式化(datum, index, data)=>string-
labelFilter连续图例的刻度值过滤(datum, index, data)=>boolean-
labelDirection连续图例的刻度值位于色带的位置,参考 axis directionpositive | negativepositive
labelSpacing连续图例的刻度值到色带的间距number3
labelAlign连续图例的刻度值对齐位置
- 'value' 对齐到刻度
- 'range' 对齐到范围
value | rangevalue
labelFontSize连续图例刻度值文字大小number | (datum, index, data) => number12
labelFontFamily连续图例刻度值文字字体string | (datum, index, data) => string-
labelFontWeight连续图例刻度值字体粗细number | (datum, index, data) => numbernormal
labelLineHeight连续图例刻度值文字的行高number | (datum, index, data) => number-
labelTextAlign设置连续图例刻度值文本内容的当前对齐方式center | end | left | right | startstart
labelTextBaseline设置在绘制连续图例刻度值文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
labelFill连续图例刻度值字体颜色string | (datum, index, data) => string#1D2129
labelFillOpacity连续图例刻度值字体颜色透明度number | (datum, index, data) => number0.45
labelStroke连续图例刻度值字体描边颜色string | (datum, index, data) => string-
labelStrokeOpacity连续图例刻度值字体描边颜色透明度number | (datum, index, data) => number-
labelLineWidth连续图例刻度值字体描边的宽度number | (datum, index, data) => number-
labelLineDash连续图例刻度值字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
labelOpacity连续图例刻度值文字的整体透明度number | (datum, index, data) => number-
labelShadowColor连续图例刻度值文字阴影颜色string | (datum, index, data) => string-
labelShadowBlur连续图例刻度值文字阴影的高斯模糊系数number | (datum, index, data) => number-
labelShadowOffsetX设置阴影距连续图例刻度值文字的水平距离number | (datum, index, data) => number-
labelShadowOffsetY设置阴影距连续图例刻度值文字的垂直距离number | (datum, index, data) => number-
labelCursor手柄标签鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault

刻度值对齐方式

  • 对齐到刻度
align-tick
  • 对齐到范围
align-range

在 Legend 组件中配置连续图例的标签/刻度值属性的时候,不是以对象的形式来配置,而是以 label前缀加属性的方式来配置。

({
legend: {
color: {
label: true,
labelFormatter: (d) => {},
labelFilter: (datum, index, data) => {},
labelDirection: 'positive',
labelSpacing: 5,
labelAlign: 'range',
// 配置连续图例的刻度值label的绘图属性
labelFontSize: 16,
labelFontFamily: 'sans-serif',
labelFontWeight: 500,
labelLineHeight: 20,
labelTextAlign: 'center',
labelTextBaseline: 'middle',
labelFill: '#000',
labelFillOpacity: 0.9,
labelStroke: '#DAF5EC',
labelStrokeOpacity: 0.9,
labelLineWidth: 2,
labelLineDash: [4, 8],
labelOpacity: 1,
labelShadowColor: '#d3d3d3',
labelShadowBlur: 10,
labelShadowOffsetX: 10,
labelShadowOffsetY: 10,
labelCursor: 'pointer',
},
},
});

indicator

LegendIndicatorCfg optional

适用于 连续图例 。配置连续图例的指示器。指示器是在与连续图例交互过程中指示当前所在位置所表示值大小的提示组件。

indicator

LegendIndicatorCfg 配置如下:

属性描述类型默认值必选
indicator是否显示连续图例的刻值指示器booleanfalse
indicatorFormatter值指示器格式化(datum, index, data)=>string-
indicatorLabelFontSize值指示器文字大小number | (datum, index, data) => number-
indicatorLabelFontFamily值指示器文字字体string | (datum, index, data) => string-
indicatorLabelFontWeight值指示器字体粗细number | (datum, index, data) => number-
indicatorLabelLineHeight值指示器文字的行高number | (datum, index, data) => number-
indicatorLabelTextAlign设置值指示器文本内容的当前对齐方式center | end | left | right | startstart
indicatorLabelTextBaseline设置在绘制值指示器文本时使用的当前文本基线top | middle | bottom | alphabetic | hangingbottom
indicatorLabelFill值指示器字体颜色string | (datum, index, data) => string-
indicatorLabelFillOpacity值指示器字体颜色透明度number | (datum, index, data) => number-
indicatorLabelStroke值指示器字体描边颜色string | (datum, index, data) => string-
indicatorLabelStrokeOpacity值指示器字体描边颜色透明度number | (datum, index, data) => number-
indicatorLabelLineWidth值指示器字体描边的宽度number | (datum, index, data) => number-
indicatorLabelLineDash值指示器字体描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
indicatorLabelOpacity值指示器文字的整体透明度number | (datum, index, data) => number-
indicatorLabelShadowColor值指示器文字阴影颜色string | (datum, index, data) => string-
indicatorLabelShadowBlur值指示器文字阴影的高斯模糊系数number | (datum, index, data) => number-
indicatorLabelShadowOffsetX设置阴影距值指示器文字的水平距离number | (datum, index, data) => number-
indicatorLabelShadowOffsetY设置阴影距值指示器文字的垂直距离number | (datum, index, data) => number-
indicatorLabelCursor值指示器鼠标样式。同 css 的鼠标样式string | (datum, index, data) => stringdefault
indicatorBackgroundFill值指示器背景填充色string | (datum, index, data) => string-
indicatorBackgroundFillOpacity值指示器背景填充透明度number | (datum, index, data) => number-
indicatorBackgroundStroke值指示器背景的描边string | (datum, index, data) => string-
indicatorBackgroundStrokeOpacity值指示器背景描边透明度number | (datum, index, data) => number-
indicatorBackgroundLineWidth值指示器背景描边的宽度number | (datum, index, data) => number-
indicatorBackgroundLineDash值指示器背景描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number,number] | (datum, index, data) => [number , number]-
indicatorBackgroundOpacity值指示器背景的整体透明度number | (datum, index, data) => number-
indicatorBackgroundShadowColor值指示器背景阴影颜色string | (datum, index, data) => string-
indicatorBackgroundShadowBlur值指示器背景阴影的高斯模糊系数number | (datum, index, data) => number-
indicatorBackgroundShadowOffsetX设置阴影距值指示器背景的水平距离number | (datum, index, data) => number-
indicatorBackgroundShadowOffsetY设置阴影距值指示器背景的垂直距离number | (datum, index, data) => number-
indicatorBackgroundCursor值指示器背景鼠标样式。同 css 的鼠标样式。string | (datum, index, data) => stringdefault

在 Legend 组件中配置值指示器属性的时候,不是以对象的形式来配置,而是以 indicator前缀加属性的方式来配置。

({
legend: {
color: {
indicator: 'true',
indicatorFormatter: (d) => {},
//配置indicatorLabel的绘图属性
indicatorLabelFontSize: 16,
indicatorLabelFontFamily: 'sans-serif',
indicatorLabelFontWeight: 500,
indicatorLabelLineHeight: 20,
indicatorLabelTextAlign: 'center',
indicatorLabelTextBaseline: 'middle',
indicatorLabelFill: '#000',
indicatorLabelFillOpacity: 0.9,
indicatorLabelStroke: '#DAF5EC',
indicatorLabelStrokeOpacity: 0.9,
indicatorLabelLineWidth: 2,
indicatorLabelLineDash: [4, 8],
indicatorLabelOpacity: 1,
indicatorLabelShadowColor: '#d3d3d3',
indicatorLabelShadowBlur: 10,
indicatorLabelShadowOffsetX: 10,
indicatorLabelShadowOffsetY: 10,
indicatorLabelCursor: 'pointer',
// 配置indicatorBackground的绘图属性
indicatorBackgroundFill: '#000',
indicatorBackgroundFillOpacity: 0.9,
indicatorBackgroundStroke: '#DAF5EC',
indicatorBackgroundStrokeOpacity: 0.9,
indicatorBackgroundLineWidth: 2,
indicatorBackgroundLineDash: [4, 8],
indicatorBackgroundOpacity: 1,
indicatorBackgroundShadowColor: '#d3d3d3',
indicatorBackgroundShadowBlur: 10,
indicatorBackgroundShadowOffsetX: 10,
indicatorBackgroundShadowOffsetY: 10,
indicatorBackgroundCursor: 'pointer',
},
},
});

事件

图例组件对外暴露了一些特殊的事件,用于获取组件的交互信息。

事件类型描述类型
click 分类图例点击图例项时触发(item:Selection)=>void
mouseenter 分类图例鼠标移入图例项时触发(item: Selection)=>void
mouseleave 分类图例鼠标移出图例项时触发(item:Selection)=>void
valuechange 连续图例滑动窗口选取范围改变时触发(range: [number, number])=>void
indicate 连续图例指示器值改变时触发(value: number, range: [number, number])=>void

组件在图表渲染后才会出现,所以要在 afterrender 后挂载组件的事件,以下是一个例子:

chart.on('afterrender', () => {
const { canvas } = chart.getContext();
const { document } = canvas;
document
.querySelector('.component')
.addEventListener('valuechange', (range) => {});
});

示例

自定义图例项图标(itemMarker)

在具体开发过程中,内置的图例项图标可能无法满足你的要求,不用担心,G2 提供了强大的自定义功能。

自定义符号(Symbol)

每一个符号都可以自定义,主要分为三步:

  • 定义符号路径。
  • 注册符号。
  • 使用符号。

首先我们来看看如何定义符号路径。一个符号路径是一个函数,该函数接受起始点的横向坐标 x、纵向坐标 y 和绘制半径,返回一个路径。

import { type SymbolFactor } from '@antv/g2';
const triangle: SymbolFactor = (x, y, r) => {
const diffY = r * Math.sin((1 / 3) * Math.PI);
return [
['M', x - r, y + diffY],
['L', x, y - diffY],
['L', x + r, y + diffY],
['Z'],
];
};
triangle.style = ['fill'];

接下来就是注册符号,通过调用 G2.register('symbol.${symbol}', Symbol) 来完成注册。其中 symbol 是符号的名字,Symbol 是定义好的符号路径。比如注册一个三角形的符号:

import { register } from '@antv/g2';
register('symbol.customTriangle', triangle);

最后就是使用该符号了

legend: {
color: {
itemMarker: 'customTriangle';
}
}

使用图片

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
});
const logo = [
[
'抖音',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*8IXHQLvx9QkAAAAAAAAAAAAADmJ7AQ/original',
],
[
'快手',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*swueRrrKvbcAAAAAAAAAAAAADmJ7AQ/original',
],
[
'小米',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*79G3TIt3mBoAAAAAAAAAAAAADmJ7AQ/original',
],
[
'微信',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*_ELBTJLp0dQAAAAAAAAAAAAADmJ7AQ/original',
],
[
'Keep',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*JzbKRpFhR14AAAAAAAAAAAAADmJ7AQ/original',
],
[
'Chrome',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*xLnYTaZfdh8AAAAAAAAAAAAADmJ7AQ/original',
],
[
'QQ',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*AbGNTpA5JLwAAAAAAAAAAAAADmJ7AQ/original',
],
[
'优酷',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*UL6lS4jw9lUAAAAAAAAAAAAADmJ7AQ/original',
],
[
'百度地图',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*I6nrTITAxcoAAAAAAAAAAAAADmJ7AQ/original',
],
[
'腾讯视频',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*zwVvT5OFnuYAAAAAAAAAAAAADmJ7AQ/original',
],
[
'哔哩哔哩',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*6jkAQayTiMMAAAAAAAAAAAAADmJ7AQ/original',
],
[
'Word',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*FbkXT6K6mVEAAAAAAAAAAAAADmJ7AQ/original',
],
[
'Excel',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*CKb-R6ZAFpYAAAAAAAAAAAAADmJ7AQ/original',
],
[
'PowerPoint',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*K7-FT4RYRqIAAAAAAAAAAAAADmJ7AQ/original',
],
[
'腾讯会议',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*xbPXR7snu44AAAAAAAAAAAAADmJ7AQ/original',
],
[
'网易云音乐',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*upKlRJ9QB4cAAAAAAAAAAAAADmJ7AQ/original',
],
[
'Safari',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*kjDHRbiW734AAAAAAAAAAAAADmJ7AQ/original',
],
[
'地图',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*tl-2QIB8LKIAAAAAAAAAAAAADmJ7AQ/original',
],
[
'Docker',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*iJ4dS49yrJ4AAAAAAAAAAAAADmJ7AQ/original',
],
[
'VSCode',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*rR6nRInEcz4AAAAAAAAAAAAADmJ7AQ/original',
],
[
'百度网盘',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*futaTbIAkG4AAAAAAAAAAAAADmJ7AQ/original',
],
[
'印象笔记',
'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*Skh1S4BfL9oAAAAAAAAAAAAADmJ7AQ/original',
],
];
chart
.interval()
.data(logo)
.encode('x', (d) => d[0])
.encode('y', () => Math.random())
.encode('color', (d) => d[1])
.scale('y', { nice: true })
.legend({
color: {
itemMarker: (_, index) => () => {
const { document } = chart.getContext().canvas;
const image = document.createElement('image', {
style: {
width: 20,
height: 20,
transform: `translate(-10, -10)`,
src: logo[index][1],
},
});
return image;
},
itemMarkerSize: 40,
itemLabelText: (_, index) => logo[index][0],
maxRows: 1,
},
})
.tooltip(false);
chart.render();

自定义图例(Legend)

G2 内置的图例是用 canvas 或者 svg 绘制的,如果希望能用 HTML 渲染图例,就可以按照如下几步自定义图例:

  • 关闭内置图例并且渲染图表。
  • 等待图表渲染完成,根据 scale 数据渲染 HTML 图例。
  • 添加交互(如果需要)。

首先是关闭内置图例,同时渲染图表。

chart.options({ legend: false });

然后是等待图表渲染完成,并且调用 legendColor 渲染 HTML 图例:

chart.render().then(legendColor);

在 legendColor 里我们首先需要把图例画出来,下面这个例子把图例画出来后,添加到了画布前面:

function legendColor(chart) {
const node = chart.getContainer();
const legend = document.createElement('div');
node.insertBefore(legend, node.childNodes[0]);
// ...
}

画出了图例之后,我们需要绘制图例项,这个数据从对应通道的比例尺获得:chart.getScale().color,并且通过 scale 的 domain 和 range 获得对应的名字和值。

function legendColor(chart) {
// ...
const scale = chart.getScale().color;
const { domain } = scale.getOptions();
const items = domain.map(() => {});
// ...
}

绘制完图例项之后我们就应该给每个图例项通过 item.onclick 添加交互,收集当前选中的值,并且根据这个值去给图表的声明添加 Filter 转换,最后重新渲染图表。最后完整的实现如下:

import { Chart } from '@antv/g2';
// 添加图例
function legendColor(chart) {
// 创建 Legend 并且挂载图例
const node = chart.getContainer();
const legend = document.createElement('div');
legend.style.display = 'flex';
node.insertBefore(legend, node.childNodes[0]);
// 创建并挂载 Items
const { color: scale } = chart.getScale();
const { domain } = scale.getOptions();
const items = domain.map((value) => {
const item = document.createElement('div');
const color = scale.map(value);
item.style.marginLeft = '1em';
item.innerHTML = `
<span style="
background-color:${color};
display:inline-block;
width:10px;
height:10px;"
></span>
<span>${value}</span>
`;
return item;
});
items.forEach((d) => legend.append(d));
// 监听事件
const selectedValues = [...domain];
const options = chart.options();
for (let i = 0; i < items.length; i++) {
const item = items[i];
const value = domain[i];
item.style.cursor = 'pointer';
item.onclick = () => {
const index = selectedValues.indexOf(value);
if (index !== -1) {
selectedValues.splice(index, 1);
item.style.opacity = 0.5;
} else {
selectedValues.push(value);
item.style.opacity = 1;
}
changeColor(selectedValues);
};
}
// 重新渲染视图
function changeColor(value) {
const { transform = [] } = options;
const newTransform = [{ type: 'filter', color: { value } }, ...transform];
chart.options({
...options,
transform: newTransform, // 指定新的 transform
scale: { color: { domain } },
});
chart.render(); // 重新渲染图表
}
}
// 绘制图表
const container = document.createElement('div');
const chart = new Chart({
container: 'container',
container,
});
chart.options({
type: 'interval',
data: [
{ genre: 'Sports', sold: 275 },
{ genre: 'Strategy', sold: 115 },
{ genre: 'Action', sold: 120 },
{ genre: 'Shooter', sold: 350 },
{ genre: 'Other', sold: 150 },
],
encode: { x: 'genre', y: 'sold', color: 'genre' },
legend: false,
});
chart.render().then(legendColor);