logo

G2

  • 图表介绍
  • 文档
  • 图表示例
  • 主题
  • 周边生态
  • 所有产品antv logo arrow
  • 5.4.2
  • 快速上手
  • 简介
    • 什么是 G2
    • 在前端框架中使用
    • Spec 和 API
  • 图表 API
  • 核心概念
    • G2 配置项总览
    • 图表组成和使用(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
      • connector
      • wordCloud
      • beeswarm
    • 视图(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
      • sliderWheel
    • 复合视图(Composition)
      • 概览
      • facetCircle
      • facetRect
      • repeatMatrix
      • spaceFlex
      • spaceLayer
      • timingKeyframe
    • 主题(Theme)
      • 概览
      • academy
      • classic
      • classicDark
    • 事件处理(Event)
    • 颜色映射(Color)
  • 图表组件
    • 标题(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

缩略轴(Slider)

上一篇
滚动条(Scrollbar)
下一篇
提示信息(Tooltip)

资源

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

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会
weavefoxWeaveFox-智能研发技术社区

帮助

GitHub
StackOverflow

more products更多产品

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

Loading...

概述

G2 中缩略轴(Slider) 可以用于过滤数据,让用户在数据量较大的情况下一次只用关注局部的数据,是一种辅助看数据的组件。它将大量数据浓缩到一个轴上,既可以缩小宏观看数据全貌,又可以放大微观看数据的片段,同时还可以拖拽观察数据在一定区间内的演变。缩略轴可以和 x 或者 y 通道绑定,用于显示不同方向的缩略轴,缩略轴默认都是关闭的。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
});
const formatter = (dateTimeString) => {
return new Date(dateTimeString).toLocaleString();
};
chart.options({
type: 'line',
autoFit: true,
data: {
type: 'fetch',
value:
'https://gw.alipayobjects.com/os/bmw-prod/551d80c6-a6be-4f3c-a82a-abd739e12977.csv',
},
encode: { x: 'date', y: 'close' },
slider: {
x: {
labelFormatter: (d) => `${formatter(d)}`,
},
},
});
chart.render();

配置层级

缩略轴支持在不同层级进行配置,不同层级的配置具有不同的作用域和特性。

Mark 层级配置

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

({
type: 'interval',
slider: {
x: {},
y: {},
},
});

特点:

  • 仅影响当前 Mark
  • 适用于需要对特定标记进行独立过滤的场景
  • 当多个 Mark 共享同一比例尺时,缩略轴会自动合并

View 层级配置

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

({
type: 'view',
slider: {
x: {},
y: {},
},
});

特点:

  • 影响整个 View 及其子元素
  • 适用于需要统一控制多个 Mark 的场景
  • 具有传递性,会影响所有子 Mark
  • 优先级高于 Mark 层级配置

何时使用

缩略轴是值域数据的浓缩,它跟位置通道 x, y 对应的比例尺的类型息息相关。一般来说时间类型上使用缩略轴的频率高,连续轴使用缩略轴频次低、分类轴几乎不会使用到缩略轴。

slider
  • 时间轴,数据跨度非常大,【高频使用】,比如一组时序数据跨度 10 年,需观察这期间数据变化趋势时,建议开启缩略轴;
  • 时间轴,数据密度很高,【高频使用】,比如分钟级更新的实时数据,当需要查看一天内的数据走势时,建议开启缩略轴;
  • 连续轴,数据密度很高,【低频使用】比如查看 1-100 岁平均身高分布,开启缩略轴可以全局查看身高分布;
  • 分类轴【不建议使用】。

使用方式

slider
import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
});
chart.options({
type: 'line',
data: {
type: 'fetch',
value:
'https://gw.alipayobjects.com/os/bmw-prod/551d80c6-a6be-4f3c-a82a-abd739e12977.csv',
},
encode: { x: 'date', y: 'close' },
slider: { y: {} }, // 开启 Y 方向缩略轴
});
chart.render();

配置项

属性描述类型默认值必选
padding缩略轴内边距number | number[]-
values缩略轴初始选区范围,位于 0 ~ 1 区间[number, number]-
slidable是否允许拖动选取和手柄booleantrue
brushable是否启用刷选booleantrue
labelFormatter缩略轴拖动手柄标签格式化(value: number)=>string-
showHandle是否显示拖动手柄booleantrue
showLabel是否显示拖动手柄文本booleantrue
showLabelOnInteraction在调整手柄或刷选时才显示手柄文本,在 showLabel 为 false 时生效booleanfalse
autoFitLabel是否自动调整拖动手柄文本位置booleantrue
style配置缩略轴组件的样式style详见 style

style

配置缩略轴组件的样式。

属性描述类型默认值必选
selection配置缩略轴选区的样式selection详见 selection
track配置缩略轴滑轨的样式track详见 track
handle配置缩略轴手柄的样式handle详见 handle
sparkline配置缩略轴迷你图的样式sparkline详见 sparkline

selection

配置缩略轴选区的样式 。

属性描述类型默认值必选
selectionFill缩略轴选区的填充色string#1783FF
selectionFillOpacity缩略轴选区的填充透明度number0.15
selectionStroke缩略轴选区的描边string-
selectionStrokeOpacity缩略轴选区的描边透明度number-
selectionLineWidth缩略轴选区的描边宽度number-
selectionLineDash缩略轴选区描边的虚线配置[number,number]-
selectionOpacity缩略轴选区的整体透明度number-
selectionShadowColor缩略轴选区的阴影颜色string-
selectionShadowBlur缩略轴选区阴影的高斯模糊系数number-
selectionShadowOffsetX设置阴影距缩略轴选区的水平距离number-
selectionShadowOffsetY设置阴影距缩略轴选区的垂直距离number-
selectionCursor缩略轴选区的鼠标样式stringdefault

在 Slider 组件中配置选区样式的时候,不是以对象的形式来配置,而是以 selection前缀加属性的方式来配置。

({
slider: {
x: {
selectionFill: '#000',
selectionFillOpacity: 0.9,
selectionStroke: '#DAF5EC',
selectionStrokeOpacity: 0.9,
selectionLineWidth: 2,
selectionLineDash: [4, 8],
selectionOpacity: 1,
selectionShadowColor: '#d3d3d3',
selectionShadowBlur: 10,
selectionShadowOffsetX: 10,
selectionShadowOffsetY: 10,
selectionCursor: 'pointer',
},
},
});

track

配置缩略轴滑轨的样式 。

属性描述类型默认值必选
trackLength缩略轴滑轨的长度number-
trackSize缩略轴滑轨的尺寸number16
trackFill缩略轴滑轨的填充色string#416180
trackFillOpacity缩略轴滑轨的填充透明度number1
trackStroke缩略轴滑轨的描边string-
trackStrokeOpacity缩略轴滑轨的描边透明度number-
trackLineWidth缩略轴滑轨的描边宽度number-
trackLineDash缩略轴滑轨描边的虚线配置[number,number]-
trackOpacity缩略轴滑轨的整体透明度number-
trackShadowColor缩略轴滑轨的阴影颜色string-
trackShadowBlur缩略轴滑轨阴影的高斯模糊系数number-
trackShadowOffsetX设置阴影距缩略轴滑轨的水平距离number-
trackShadowOffsetY设置阴影距缩略轴滑轨的垂直距离number-
trackCursor缩略轴滑轨的鼠标样式stringdefault

在 Slider 组件中配置选区样式的时候,不是以对象的形式来配置,而是以 track前缀加属性的方式来配置。

({
slider: {
x: {
trackSize: 20,
trackFill: '#000',
trackFillOpacity: 0.9,
trackStroke: '#DAF5EC',
trackStrokeOpacity: 0.9,
trackLineWidth: 2,
trackLineDash: [4, 8],
trackOpacity: 1,
trackShadowColor: '#d3d3d3',
trackShadowBlur: 10,
trackShadowOffsetX: 10,
trackShadowOffsetY: 10,
trackCursor: 'pointer',
},
},
});

handle

配置缩略轴手柄的样式。

属性描述类型默认值必选
handleLabelFontSize手柄标签的文字大小number12
handleLabelFontFamily手柄标签的文字字体string-
handleLabelFontWeight手柄标签的字体粗细numbernormal
handleLabelLineHeight手柄标签文字的行高number-
handleLabelTextAlign设置手柄标签文字的水平对齐方式center | end | left | right | startstart
handleLabelTextBaseline设置手柄标签文字的垂直基线top | middle | bottom | alphabetic | hangingbottom
handleLabelFill手柄标签的文字填充色string#1D2129
handleLabelFillOpacity手柄标签的文字填充透明度number0.45
handleLabelStroke手柄标签的文字描边string-
handleLabelStrokeOpacity手柄标签的文字描边透明度number-
handleLabelLineWidth手柄标签文字的描边宽度number-
handleLabelLineDash手柄标签文字描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number , number]-
handleLabelOpacity手柄标签文字的整体透明度number-
handleLabelShadowColor手柄标签的文字阴影颜色string-
handleLabelShadowBlur手柄标签文字阴影的高斯模糊系数number-
handleLabelShadowOffsetX设置阴影距手柄标签文字的水平距离number-
handleLabelShadowOffsetY设置阴影距手柄标签文字的垂直距离number-
handleLabelCursor手柄标签的鼠标样式stringdefault
handleLabelDx手柄标签文字在水平方向的偏移量number0
handleLabelDy手柄标签文字在垂直方向的偏移量number0
handleIconRadius手柄图标的圆角number2
handleIconSize手柄图标的尺寸number10
handleIconFill手柄图标的填充色string#f7f7f7
handleIconFillOpacity手柄图标的填充透明度number1
handleIconStroke手柄图标的描边string#1D2129
handleIconStrokeOpacity手柄图标的描边透明度number0.25
handleIconLineWidth手柄图标的描边宽度number1
handleIconLineDash手柄图标描边的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0,0]的效果为没有描边。[number , number]-
handleIconOpacity手柄图标的整体透明度number-
handleIconShadowColor手柄图标的阴影颜色string-
handleIconShadowBlur手柄图标阴影的高斯模糊系数number-
handleIconShadowOffsetX设置阴影距手柄图标的水平距离number-
handleIconShadowOffsetY设置阴影距手柄图标的垂直距离number-
handleIconCursor手柄图标的鼠标样式stringdefault

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

({
slider: {
x: {
//配置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',
},
},
});

sparkline

配置缩略轴迷你图的样式。

属性描述类型默认值必选
sparklineType迷你图类型:折线图、直方图line | columnline
sparklineIsStack是否对数据进行堆叠booleanfalse
sparklineRange指定值范围,未指定时将使用 data 的最小值和最大值[number, number]-
sparklineColor指定颜色string | string[] | (index: number)=>string-
sparklineSmooth适用于折线图,平滑曲线booleanfalse
sparklineLineStroke适用于折线图,线的颜色string-
sparklineLineStrokeOpacity适用于折线图,线的透明度number-
sparklineLineLineDash适用于折线图,线的虚线配置,第一个值为虚线每个分段的长度,第二个值为分段间隔的距离。lineDash 设为[0, 0]的效果为没有描边。[number,number]-
sparklineAreaFill适用于折线图,填充区域的颜色string-
sparklineAreaFillOpacity适用于折线图,填充区域的透明度number-
sparklineColumnFill适用于直方图,条形的颜色string-
sparklineColumnFillOpacity适用于直方图,条形的透明度number-
sparklineIsGroup适用于直方图,是否分组显示booleanfalse
sparklineSpacing适用于直方图,分组直方的间距number0

在 Slider 组件中配置迷你图属性的时候,不是以对象的形式来配置,而是以 sparkline前缀加属性的方式来配置。

({
slider: {
x: {
sparklineType: 'line',
sparklineColor: 'red',
},
},
});

事件

属性描述类型
valuechange选区发生变化时触发,通过事件监听({detail: { value: any; }}) => void
import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
});
chart
.line()
.data({
type: 'fetch',
value:
'https://gw.alipayobjects.com/os/bmw-prod/551d80c6-a6be-4f3c-a82a-abd739e12977.csv',
})
.encode('x', 'date')
.encode('y', 'close')
// 开启 X 轴缩略轴
.slider('x', {});
chart.on('afterrender', () => {
const { canvas } = chart.getContext();
const { document } = canvas;
document.querySelector('.slider').addEventListener('valuechange', (evt) => {
console.info(evt.detail);
});
});
chart.render();

常用交互

滚轮缩放(sliderWheel)

sliderWheel 交互允许用户通过鼠标滚轮或触控板手势来控制缩略轴的选择范围,实现数据范围的快速缩放操作。

  • 触发方式:在图表区域内使用鼠标滚轮或触控板滚动
  • 交互效果:放大缩小选区范围,保持选区中心位置不变
  • 使用场景:适合需要频繁调整数据查看范围的场景

配置方式

({
slider: {
x: {}, // 启用 X 轴缩略轴
},
interaction: {
sliderWheel: true, // 启用滚轮缩放交互
},
});

也可以传入配置项进行自定义:

({
slider: {
x: {},
},
interaction: {
sliderWheel: {
wheelSensitivity: 0.1, // 滚轮灵敏度
minRange: 0.05, // 最小缩放范围
x: true, // X 轴响应模式
y: 'shift', // Y 轴仅在按住 Shift 键时响应
},
},
});

主要配置项

属性描述类型默认值
minRange最小缩放范围number0.01
wheelSensitivity滚轮缩放灵敏度number0.05
xX 轴滚轮交互响应模式boolean | stringtrue
yY 轴滚轮交互响应模式boolean | stringtrue

示例

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
});
chart.options({
type: 'line',
autoFit: true,
data: {
type: 'fetch',
value:
'https://gw.alipayobjects.com/os/bmw-prod/551d80c6-a6be-4f3c-a82a-abd739e12977.csv',
},
encode: { x: 'date', y: 'close' },
slider: {
x: {
labelFormatter: (d) => {
return new Date(d).toLocaleDateString();
},
},
},
interaction: {
sliderWheel: {
wheelSensitivity: 0.08,
minRange: 0.02,
},
},
});
chart.render();

自适应过滤

缩略轴不仅可以用于数据过滤,还支持自适应过滤功能。当拖拽缩略轴时,根据当前选择的数据范围自动调整其他轴的显示范围,提供更好的数据探索体验。

重要说明

自适应策略需要在 sliderFilter 交互中配置,而不是在 slider 组件中配置。 从 G2 5.4.1 开始,当你配置 slider 组件时,会自动启用自适应过滤功能,如果不需要自适应,需要手动关闭。

配置方式

1. 默认自适应(推荐)

配置 slider 组件时,默认启用自适应过滤:

// 默认情况下会自动启用自适应过滤
chart.options(
slider:{
x:{}
}
);

2. 手动配置 sliderFilter

如需自定义自适应策略,在 sliderFilter 交互中配置:

chart.options(
slider:{
x:{}
},
interaction:{
sliderFilter:{
adaptiveMode: 'filter', // 启用自适应
}
}
);

3. 手动关闭自适应

如果不需要自适应功能,需要显式关闭:

chart.options(
slider:{
x:{}
},
interaction:{
sliderFilter:{
adaptiveMode: false // 手动关闭自适应
}
}
);

自适应模式参数

通过 sliderFilter 交互中的 adaptiveMode 配置项可以控制自适应过滤的行为:

{
slider: {
x: { values: [0.1, 0.8] }
},
interaction: {
sliderFilter: {
adaptiveMode: 'filter' // 启用自适应过滤(默认值)
// adaptiveMode: false // 禁用自适应过滤
}
}
}

可选值:

  • 'filter':启用自适应过滤,根据选定数据范围动态调整其他轴的域值(默认值)
  • false 或 null:禁用自适应过滤
  • 更多的自适应策略会在后续版本推出,敬请期待。

具体场景

系统会根据不同的配置场景采用不同的自适应策略。在单轴的情况下,slider 配置在 View 层 或 Mark 层效果一样。但在多轴图中,会有不同的自适应策略:

  • 多轴自适应:当图表中存在独立的坐标轴(通过 scale: { y: { independent: true }} 配置)时,会启用多轴自适应策略。根据 slider 配置的层级,会有不同的自适应策略。

    • View 层级配置:影响整个视图中的所有 Mark,适用于需要统一控制多个图表的场景
    • Mark 层级配置:仅影响特定的 Mark,适用于需要对某个特定标记进行独立过滤的场景
  • 自适应计算逻辑:通过收集所有 marks 的通道数据,调用指定的过滤逻辑进行自适应过滤计算,根据当前筛选范围动态计算 Y 轴的 domain 范围,确保显示的数据范围始终合理。

单轴自适应

当只有 X 轴或只有 Y 轴配置了缩略轴时,会启用单轴自适应过滤。拖拽缩略轴时,会根据当前选择的数据范围自动调整另一个轴的显示范围。

单 Mark 场景

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
});
const data = [];
for (let i = 0; i < 150; i++) {
data.push({
x: i,
y: Math.sin(i / 15) * 60 + 80 + Math.random() * 25,
category: i % 3 === 0 ? 'A' : i % 3 === 1 ? 'B' : 'C',
});
}
chart.options({
type: 'point',
data,
encode: { x: 'x', y: 'y', color: 'category' },
slider: {
x: {
values: [0.1, 0.8],
labelFormatter: (d) => `X: ${Math.round(d)}`,
},
},
style: {
fillOpacity: 0.8,
},
});
chart.render();

import { Chart } from '@antv/g2';
const chart = new Chart({ container: 'container', autoFit: true });
chart.options({
type: 'view',
autoFit: true,
data: {
type: 'fetch',
value: 'https://assets.antv.antgroup.com/g2/stocks.json',
transform: [{ type: 'filter', callback: (d) => d.symbol === 'GOOG' }],
},
slider: {
x: {},
},
children: [
{
type: 'area',
encode: { x: (d) => new Date(d.date), y: 'price' },
style: { fill: 'linear-gradient(-90deg, white 0%, darkgreen 100%)' },
},
{
type: 'line',
encode: { x: (d) => new Date(d.date), y: 'price' },
style: { stroke: 'darkgreen', lineWidth: 2 },
},
],
});
chart.render();

import { Chart } from '@antv/g2';
import { randomPoisson } from 'd3-random';
const random = randomPoisson(Math.pow(10, 2.6));
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart.options({
type: 'rect',
data: new Array(5000).fill(0).map(random),
encode: { x: (d) => d },
transform: [{ type: 'binX', y: 'count' }],
style: { stroke: 'white' },
slider: { x: {} },
tooltip: {
title: (d, i, data, column) => ({
value: `${column.x.value[i]} ~ ${column.x1.value[i]}`,
}),
},
});
chart.render();
多 Mark 场景

单轴场景下,slider 配置在 View 层 或 Mark 层效果一样。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
inset: 3, // 设置内边距,防止自适应过程中 point被截断
});
const data = [
{ time: 0, sales: 200, profit: 150, revenue: 600 }, // 起始高值
{ time: 1, sales: 195, profit: 145, revenue: 580 },
{ time: 2, sales: 190, profit: 140, revenue: 560 },
{ time: 3, sales: 185, profit: 135, revenue: 540 },
{ time: 4, sales: 180, profit: 130, revenue: 520 },
{ time: 5, sales: 175, profit: 125, revenue: 500 },
{ time: 6, sales: 170, profit: 120, revenue: 480 },
{ time: 7, sales: 165, profit: 115, revenue: 460 },
{ time: 8, sales: 160, profit: 110, revenue: 440 },
{ time: 9, sales: 155, profit: 105, revenue: 420 },
{ time: 10, sales: 150, profit: 100, revenue: 400 },
{ time: 11, sales: 145, profit: 95, revenue: 380 },
{ time: 12, sales: 140, profit: 90, revenue: 360 },
{ time: 13, sales: 135, profit: 85, revenue: 340 },
{ time: 14, sales: 130, profit: 80, revenue: 320 },
{ time: 15, sales: 125, profit: 75, revenue: 300 },
{ time: 16, sales: 120, profit: 70, revenue: 280 },
{ time: 17, sales: 115, profit: 65, revenue: 260 },
{ time: 18, sales: 110, profit: 60, revenue: 240 },
{ time: 19, sales: 105, profit: 55, revenue: 220 },
{ time: 20, sales: 100, profit: 50, revenue: 200 },
{ time: 21, sales: 95, profit: 45, revenue: 180 },
{ time: 22, sales: 90, profit: 40, revenue: 160 },
{ time: 23, sales: 85, profit: 35, revenue: 140 },
{ time: 24, sales: 80, profit: 30, revenue: 120 },
];
chart.options({
type: 'view',
data,
children: [
{
type: 'line',
encode: { x: 'time', y: 'sales' },
style: { stroke: '#1890ff', lineWidth: 2 },
},
{
type: 'line',
encode: { x: 'time', y: 'profit' },
style: { stroke: '#52c41a', lineWidth: 2 },
},
{
type: 'point',
encode: { x: 'time', y: 'revenue', size: 3 },
style: { fill: '#ff4d4f' },
},
],
slider: {
x: {
labelFormatter: (d) => `时间: ${Math.round(d)}`,
},
},
});
chart.render();

多轴自适应(独立坐标轴)

当图表中存在独立的坐标轴(通过 scale: { independent: true } 配置)时,系统会采用多轴自适应策略。根据 slider 的配置层级,会有不同的自适应策略。

1. View 层级 slider

影响整个视图中的所有 Mark,适用于需要统一控制多个图表的场景

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
});
const data = [];
for (let i = 0; i < 60; i++) {
data.push({
date: `Day-${i + 1}`,
sales: Math.sin(i / 10) * 300 + 800 + Math.random() * 200,
profit: Math.cos(i / 8) * 50 + 75 + Math.random() * 25,
revenue: Math.sin(i / 12) * 800 + 1500 + Math.random() * 300,
});
}
chart.options({
type: 'view',
data,
children: [
{
type: 'interval',
encode: { x: 'date', y: 'sales' },
scale: { y: { nice: true } },
style: { fill: '#1890ff', fillOpacity: 0.6 },
},
{
type: 'line',
encode: { x: 'date', y: 'profit' },
scale: {
y: {
key: 'y1',
independent: true,
nice: true,
},
},
style: { stroke: '#ff4d4f', lineWidth: 3 },
},
{
type: 'area',
encode: { x: 'date', y: 'revenue' },
scale: {
y: {
key: 'y2',
independent: true,
nice: true,
},
},
style: { fill: '#52c41a', fillOpacity: 0.4 },
},
],
// View 层级配置缩略轴,自适应同时影响所有轴
slider: {
x: {
labelFormatter: (d) => d,
},
},
});
chart.render();
1. Mark 层级 slider

当缩略轴配置在特定 Mark 上时,系统会识别该 Mark 对应的轴,并对共享相同轴的所有 Mark 进行联动自适应。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
});
const data = [];
for (let i = 0; i < 60; i++) {
data.push({
date: `Day-${i + 1}`,
sales: Math.sin(i / 10) * 300 + 800 + Math.random() * 200,
profit: Math.cos(i / 8) * 50 + 75 + Math.random() * 25,
revenue: Math.sin(i / 12) * 800 + 1500 + Math.random() * 300,
});
}
chart.options({
type: 'view',
data,
children: [
{
type: 'interval',
encode: { x: 'date', y: 'sales' },
scale: { y: { nice: true } },
style: { fill: '#1890ff', fillOpacity: 0.6 },
// Mark 层级 slider,自适应只作用于当前 mark 对应的轴
slider: {
x: {
labelFormatter: (d) => d,
},
},
},
{
type: 'line',
encode: { x: 'date', y: 'profit' },
scale: {
y: {
key: 'y1',
independent: true,
nice: true,
},
},
style: { stroke: '#ff4d4f', lineWidth: 3 },
},
{
type: 'area',
encode: { x: 'date', y: 'revenue' },
scale: {
y: {
key: 'y2',
independent: true,
nice: true,
},
},
style: { fill: '#52c41a', fillOpacity: 0.4 },
},
],
});
chart.render();

自适应特性

离散轴与连续轴

  • 连续轴:自适应时会计算数据的最小值和最大值,形成新的域值范围
  • 离散轴:自适应时会收集所有在范围内的离散值,去重后作为新的域值
  • 零基线保持:对于原始域值包含 0 的连续轴,自适应时会保持零基线

双向联动

如果 X 轴与 Y 轴都配置了缩略轴,即使配置了自适应策略,也不会生效。

import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
});
const data = [];
for (let i = 0; i < 300; i++) {
const x = Math.random() * 100;
const y = x * 0.7 + Math.random() * 30 + 10;
data.push({
x,
y,
size: Math.random() * 8 + 3,
category: Math.random() > 0.5 ? 'A' : 'B',
});
}
chart.options({
type: 'point',
data,
encode: {
x: 'x',
y: 'y',
size: 'size',
color: 'category',
},
// 同时配置 X 和 Y 轴缩略轴,此时自适应不会生效
slider: {
x: {
values: [0.2, 0.8],
labelFormatter: (d) => `X: ${Math.round(d)}`,
},
y: {
values: [0.1, 0.9],
labelFormatter: (d) => `Y: ${Math.round(d)}`,
},
},
scale: {
x: { nice: true },
y: { nice: true },
},
style: {
fillOpacity: 0.7,
},
});
chart.render();

示例

自定义缩略轴(Slider)

如果不希望使用 G2 默认的缩略轴,就可以按照以下几步自定义:

  • 在渲染结束后渲染 slider。
  • 监听 slider 事件。

第一步的的关键是通过 chart.getCoordinate 获得的 coordinate 对象确定 slider 的位置和长度。第二步的关键是通过 chart.getScale 获得 scale 对选择的范围进行 invert,最后获得选择的数据范围,然后更新 scale 的定义域。

const { Chart } = G2;
const chart = new Chart({
container: 'container',
});
const container = chart.getContainer();
function sliderX(chart) {
// 创建并且挂载 range
const container = chart.getContainer();
const range = document.createElement('input');
container.append(range);
// 根据 coordinate 设置 range 的宽度等属性
const coordinate = chart.getCoordinate();
const { paddingLeft, width } = coordinate.getOptions();
range.type = 'range';
range.min = 0;
range.max = width;
range.value = width;
range.style.display = 'block';
range.style.width = width + 'px';
range.style.marginLeft = paddingLeft + 'px';
// 监听 change 事件,通过 scale 获得筛选得到的 domain
// 更新 domain 并且渲染
const scale = chart.getScaleByChannel('x');
const options = chart.options();
range.onchange = (event) => {
const value = event.target.value;
const range = [0, value / width];
const domain = range.map((d) => scale.invert(d));
chart.options({
...options,
scale: { x: { domain } },
});
chart.render();
};
}
// 渲染图表
chart.options({
type: 'line',
data: {
type: 'fetch',
value:
'https://gw.alipayobjects.com/os/bmw-prod/551d80c6-a6be-4f3c-a82a-abd739e12977.csv',
},
encode: { x: 'date', y: 'close' },
});
chart.render().then(sliderX);

Mark 层级配置示例

Mark 层级配置仅影响特定的 Mark,适用于需要对某个特定标记进行独立过滤的场景:

import { Chart } from '@antv/g2';
const chart2 = new Chart({
container: 'container',
autoFit: true,
});
// 标准的G2数据结构 - 不同类型的数据,添加极高值展示自适应效果
const data2 = [
{ category: 'A', time: 0, value: 45, type: 'primary' },
{ category: 'A', time: 1, value: 52, type: 'primary' },
{ category: 'A', time: 2, value: 48, type: 'primary' },
{ category: 'A', time: 3, value: 10, type: 'primary' },
{ category: 'A', time: 4, value: 55, type: 'primary' },
{ category: 'A', time: 5, value: 67, type: 'primary' },
{ category: 'A', time: 6, value: 43, type: 'primary' },
{ category: 'A', time: 7, value: 66, type: 'primary' },
{ category: 'A', time: 8, value: 63, type: 'primary' },
{ category: 'A', time: 9, value: 71, type: 'primary' },
{ category: 'A', time: 10, value: 58, type: 'primary' },
{ category: 'A', time: 11, value: 44, type: 'primary' },
{ category: 'A', time: 12, value: 49, type: 'primary' },
{ category: 'A', time: 13, value: 66, type: 'primary' },
{ category: 'A', time: 14, value: 54, type: 'primary' },
{ category: 'B', time: 0, value: 32, type: 'secondary' },
{ category: 'B', time: 1, value: 38, type: 'secondary' },
{ category: 'B', time: 2, value: 29, type: 'secondary' },
{ category: 'B', time: 3, value: 44, type: 'secondary' },
{ category: 'B', time: 4, value: 41, type: 'secondary' },
{ category: 'B', time: 5, value: 20, type: 'secondary' },
{ category: 'B', time: 6, value: 28, type: 'secondary' },
{ category: 'B', time: 7, value: 39, type: 'secondary' },
{ category: 'B', time: 8, value: 35, type: 'secondary' },
{ category: 'B', time: 9, value: 48, type: 'secondary' },
{ category: 'B', time: 10, value: 35, type: 'secondary' },
{ category: 'B', time: 11, value: 42, type: 'secondary' },
{ category: 'B', time: 12, value: 31, type: 'secondary' },
{ category: 'B', time: 13, value: 45, type: 'secondary' },
{ category: 'B', time: 14, value: 37, type: 'secondary' },
{ category: 'C', time: 0, value: 28, type: 'tertiary' },
{ category: 'C', time: 1, value: 31, type: 'tertiary' },
{ category: 'C', time: 2, value: 25, type: 'tertiary' },
{ category: 'C', time: 3, value: 35, type: 'tertiary' },
{ category: 'C', time: 4, value: 185, type: 'tertiary' }, // 极高值
{ category: 'C', time: 5, value: 38, type: 'tertiary' },
{ category: 'C', time: 6, value: 22, type: 'tertiary' },
{ category: 'C', time: 7, value: 29, type: 'tertiary' },
{ category: 'C', time: 8, value: 45, type: 'tertiary' },
{ category: 'C', time: 9, value: 36, type: 'tertiary' },
{ category: 'C', time: 10, value: 31, type: 'tertiary' },
{ category: 'C', time: 11, value: 27, type: 'tertiary' },
{ category: 'C', time: 12, value: 105, type: 'tertiary' }, // 极高值
{ category: 'C', time: 13, value: 33, type: 'tertiary' },
{ category: 'C', time: 14, value: 29, type: 'tertiary' },
];
chart2.options({
type: 'view',
data: data2,
children: [
{
type: 'interval',
data: {
value: data2,
transform: [{ type: 'filter', callback: (d) => d.type === 'primary' }],
},
encode: { x: 'time', y: 'value' },
style: { fill: '#1890ff', fillOpacity: 0.6 },
// Mark 层级配置 - 仅控制柱状图的过滤
slider: {
x: {
values: [0.2, 0.7],
labelFormatter: (d) => `柱状图: ${Math.round(d)}`,
},
},
},
{
type: 'line',
data: {
value: data2,
transform: [
{ type: 'filter', callback: (d) => d.type === 'secondary' },
],
},
encode: { x: 'time', y: 'value' },
style: { stroke: '#52c41a', lineWidth: 2 },
},
{
type: 'point',
data: {
value: data2,
transform: [{ type: 'filter', callback: (d) => d.type === 'tertiary' }],
},
encode: { x: 'time', y: 'value', size: 4 },
style: { fill: '#ff4d4f', fillOpacity: 0.8 },
},
],
scale: {
x: { nice: true },
y: { nice: true },
},
});
chart2.render();