logo

G6

  • 文档
  • API
  • 图表示例
  • 社区
  • 所有产品antv logo arrow
  • 5.0.47
  • 简介
  • 开始使用
    • 快速开始
    • 安装
    • 前端框架集成
      • 在 React 中使用
      • 在 Vue 中使用
      • 在 Angular 中使用
    • 详细教程
  • 图 Graph
    • Graph - 图
    • Options 配置项
    • 内置扩展
    • Extension - 扩展
  • 数据 Data
  • 元素 Element
    • 元素总览
    • 元素状态
    • 节点 Node
      • 节点总览
      • 内置节点
        • 节点通用配置项
        • Diamond 菱形
        • Donut 甜甜圈
        • Ellipse 椭圆形
        • Hexagon 六边形
        • Html HTML
        • Image 图片
        • Rect 矩形
        • Star 五角形
        • Triangle 三角形
        • Circle 圆形
      • 自定义节点
      • 使用 React 定义节点
    • 边 Edge
      • 边总览
      • 内置边
        • 边通用配置项
        • Cubic 三次贝塞尔曲线
        • CubicHorizontal 水平三次贝塞尔曲线
        • CubicVertical 垂直三次贝塞尔曲线
        • Line 直线
        • Polyline 折线
        • Quadratic 二次贝塞尔曲线
      • 自定义边
    • 组合 Combo
      • 组合总览
      • 内置组合
        • 组合配置项
        • Circle 圆形
        • Rect 矩形
      • 自定义 Combo
    • 图形 Shape
      • 图形 Shape 与 KeyShape
      • 原子 Shape 以及其属性
      • 复合 Shape 的设计与实现
  • 布局 Layout
    • 布局总览
    • 内置布局
      • 布局通用配置项
      • AntvDagre 布局
      • Circular 环形布局
      • ComboCombined 复合布局
      • CompactBox 紧凑树
      • Concentric 同心圆布局
      • D3Force 力导向布局
      • D3Force3D 3D 力导向布局
      • Dagre 布局
      • Dendrogram 生态树
      • Fishbone 鱼骨布局
      • Force 力导向布局
      • ForceAtlas2 力导向布局
      • Fruchterman 力导向布局
      • Grid 网格布局
      • Indented 缩进树
      • MDS 高维数据降维布局
      • Mindmap 脑图树
      • Radial 径向布局
      • Random 随机布局
      • Snake 蛇形布局
    • 自定义布局
  • 交互 Behavior
    • 交互总览
    • 内置交互
      • AutoAdaptLabel 标签自适应显示
      • BrushSelect 框选
      • ClickSelect 点击选中
      • CollapseExpand 展开/收起元素
      • CreateEdge 创建边
      • DragCanvas 拖拽画布
      • DragElement 拖拽元素
      • DragElementForce 力导向拖拽元素
      • FixElementSize 缩放画布时固定元素大小
      • FocusElement 聚焦元素
      • HoverActivate 悬停激活
      • LassoSelect 套索选择
      • OptimizeViewportTransform 优化视口变换
      • ScrollCanvas 滚动画布
      • ZoomCanvas 缩放画布
    • 自定义交互
  • 插件 Plugin
    • 插件总览
    • 内置插件
      • Background 背景
      • BubbleSets 气泡集
      • Contextmenu 上下文菜单
      • EdgeBundling 边绑定
      • EdgeFilterLens 边过滤镜
      • Fisheye 鱼眼放大镜
      • Fullscreen 全屏展示
      • GridLine 网格线
      • History 历史记录
      • Hull 轮廓包围
      • Legend 图例
      • Minimap 小地图
      • Snapline 对齐线
      • Timebar 时间条
      • Toolbar 工具栏
      • Tooltip 提示框
      • Watermark 水印
    • 自定义插件
  • 数据处理 Transform
    • 数据处理总览
    • 内置数据处理
      • MapNodeSize 动态调整节点大小
      • PlaceRadialLabels 径向标签
      • ProcessParallelEdges 平行边
    • 自定义数据处理
  • 主题 Theme
    • 主题总览
    • 自定义主题
    • 色板
    • 自定义色板
  • 动画 Animation
    • 动画总览
    • 自定义动画
  • 扩展阅读
    • 事件
    • 渲染器
    • 坐标系
    • 下载图片
    • 使用 iconfont
    • 使用 3D
    • 项目打包
  • 版本特性
    • 新版本特性
    • 升级到 5.0
  • 常见问题
  • 参与贡献

Timebar 时间条

上一篇
Snapline 对齐线
下一篇
Toolbar 工具栏

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...

概述

时间条插件是一个用于时序数据探索的重要工具,它能够通过时间轴或趋势图的形式展示数据的时间分布,并支持时间区间筛选、动态播放等交互方式,帮助用户更好地理解数据随时间的变化。

使用场景

  • 需要展示和分析时序数据的时间分布
  • 需要通过时间维度筛选和探索图数据
  • 需要动态展示数据随时间变化的过程

基本用法

以下是一个简单的 Timebar 插件初始化示例:

const graph = new Graph({
plugins: [
{
type: 'timebar',
data: timeData, // 时间数据
width: 450, // 时间条宽度
height: 60, // 时间条高度
position: 'bottom', // 位置
loop: false, // 是否循环播放
},
],
});

在线体验

createGraph(
{
data: {
nodes: new Array(25).fill(0).map((_, index) => ({
id: `node-${index}`,
data: {
timestamp: new Date('2023-08-01').getTime() + (index % 5) * 3600 * 24 * 1000,
value: index % 10,
label: new Date(new Date('2023-08-01').getTime() + (index % 5) * 3600 * 24 * 1000).toLocaleString(),
},
})),
edges: new Array(25).fill(0).map((_, i) => ({
id: `edge-${i}`,
source: `node-${i % 12}`,
target: `node-${(i % 10) + 15}`,
data: {
edgeType: 'e1',
},
})),
},
layout: { type: 'grid', cols: 5 },
node: {
style: { size: 24, fill: '#7e3feb' },
palette: { field: 'cluster' },
},
edge: { style: { stroke: '#8b9baf' } },
behaviors: ['drag-canvas'],
plugins: [
'grid-line',
{
type: 'timebar',
key: 'timebar',
data: [10, 2, 3, 4, 15].map((value, index) => ({
time: new Date(new Date('2023-08-01').getTime() + index * 3600 * 24 * 1000),
value,
label: new Date(new Date('2023-08-01').getTime() + index * 3600 * 24 * 1000).toLocaleString(),
})),
timebarType: 'time',
height: 100,
},
],
autoFit: 'view',
padding: [10, 0, 100, 0],
},
{ width: 600, height: 400 },
(gui, graph) => {
const options = {
type: 'timebar',
position: 'bottom',
enable: true,
timebarType: 'time',
className: 'g6-timebar',
width: 450,
height: 100,
zIndex: 3,
elementTypes: ['node'],
mode: 'modify',
loop: false,
};
const optionFolder = gui.addFolder('Timebar Options');
optionFolder.add(options, 'type').disable(true);
optionFolder.add(options, 'height', 40, 100, 1);
optionFolder.add(options, 'width', 200, 800, 1);
optionFolder.add(options, 'position', ['bottom', 'top']);
optionFolder.add(options, 'timebarType', ['time', 'chart']);
optionFolder.add(options, 'loop');
optionFolder.onChange(({ property, value }) => {
graph.updatePlugin({
key: 'timebar',
[property]: value,
});
graph.render();
});
const apiFolder = gui.addFolder('Timebar API');
const instance = graph.getPluginInstance('timebar');
apiFolder.add(instance, 'play');
apiFolder.add(instance, 'pause');
apiFolder.add(instance, 'forward');
apiFolder.add(instance, 'backward');
apiFolder.add(instance, 'reset');
},
);

配置项

属性描述类型默认值必选
type插件类型stringtimebar✓
key插件的唯一标识,可用于获取插件实例或更新插件选项string-
className给工具栏的 DOM 追加的类名stringg6-timebar
xX 位置(设置后 position 会失效)number-
yY 位置(设置后 position 会失效)number-
width时间条宽度number450
height时间条高度number60
position时间条位置bottom | topbottom
padding边距number | number[]10
data时间数据number[] | { time: number; value: number }[]-✓
timebarType时间条展示类型time | charttime
elementTypes筛选元素类型(node | edge | combo)[][node]
mode控制元素的筛选方式,支持以下两种配置:
- modify:通过修改图数据进行筛选
- visibility:通过修改元素可见性进行筛选
modify | visibilitymodify
values当前时间值number | [number, number] | Date | [Date, Date]-
loop是否循环播放booleanfalse
getTime获取元素时间的方法(datum: ElementDatum) => number-
labelFormatter图表模式下自定义时间格式化(time: number | Date) => string-
onChange时间区间变化时的回调(values: number | [number, number]) => void-
onReset重置时的回调() => void-
onSpeedChange播放速度变化时的回调(speed: number) => void-
onPlay开始播放时的回调() => void-
onPause暂停时的回调() => void-
onBackward后退时的回调() => void-
onForward前进时的回调() => void-

timebarType

timebarType 属性用于控制时间条的展示类型,支持以下两种配置:

  • time:显示为时间轴形式,参考 时间模式示例
  • chart:显示为趋势图形式,此时timebar下的data配置项,每个数组项需要额外传入 value 字段作为图表数据,参考 图表模式示例

代码示例

基础用法

最简单的配置方式:

const graph = new Graph({
layout: { type: 'grid', cols: 5 },
plugins: [
{
type: 'timebar',
data: [
{
time: new Date('2023-08-01').getTime(),
value: 5,
},
{
time: new Date('2023-08-02').getTime(),
value: 10,
},
{
time: new Date('2023-08-03').getTime(),
value: 15,
},
],
},
],
data: {
nodes: [
{
id: 'node1',
label: '节点1',
// 默认情况下 elementTypes=['node'],所以节点需要设置 data.timestamp,才能按照时间轴内的时间依次展示
data: {
timestamp: new Date('2023-08-01').getTime(),
},
},
{
id: 'node2',
label: '节点2',
data: {
timestamp: new Date('2023-08-02').getTime(),
},
},
{
id: 'node3',
label: '节点3',
data: {
timestamp: new Date('2023-08-03').getTime(),
},
},
],
edges: [
{
id: 'edge1',
source: 'node1',
target: 'node2',
// 场景一:默认情况 elementTypes = ['node']
// - 边不需要设置 data.timestamp,边的显示/隐藏完全取决于其连接的两个节点是否可见
// 场景二:如果elementTypes包含了'edge',比如 elementTypes = ['node', 'edge']
// - 此时必须为边设置 data.timestamp,边的显示受其控制
// data: {
// timestamp: new Date('2023-08-01').getTime()
// }
},
{
id: 'edge2',
source: 'node2',
target: 'node3',
},
{
id: 'edge3',
source: 'node3',
target: 'node1',
},
],
},
});

效果如下:

createGraph(
{
width: 600,
height: 400,
layout: { type: 'grid', cols: 5 },
plugins: [
{
type: 'timebar',
data: [
{
time: new Date('2023-08-01').getTime(),
value: 5,
},
{
time: new Date('2023-08-02').getTime(),
value: 10,
},
{
time: new Date('2023-08-03').getTime(),
value: 15,
},
],
},
],
data: {
nodes: [
{
id: 'node1',
label: '节点1',
data: {
timestamp: new Date('2023-08-01').getTime(),
},
},
{
id: 'node2',
label: '节点2',
data: {
timestamp: new Date('2023-08-02').getTime(),
},
},
{
id: 'node3',
label: '节点3',
data: {
timestamp: new Date('2023-08-03').getTime(),
},
},
],
edges: [
{
id: 'edge1',
source: 'node1',
target: 'node2',
},
{
id: 'edge2',
source: 'node2',
target: 'node3',
},
{
id: 'edge3',
source: 'node3',
target: 'node1',
},
],
},
},
{ width: 600, height: 400 },
);

自定义样式

width、height、padding、className 可自定义时间条的展示效果,但需要注意 className 仅作用于外层 DOM 容器,无法影响时间条内部的 Canvas 渲染内容(时间轴、图表、播放按钮等)。

const graph = new Graph({
plugins: [
{
type: 'timebar',
className: 'custom-timebar', // 注意:由于内容是 Canvas 渲染,CSS 样式无法影响到时间条的内部内容
width: 400, // 设置时间条宽度
height: 80, // 设置时间条高度
padding: [20, 20, 10, 20], // 设置内边距 [上, 右, 下, 左]
position: 'bottom', // 位置保持在底部
data: timeData,
// labelFormatter: (time) => {
// return new Date(time).toLocaleDateString();
// }
},
],
});

通过 CSS 只能设置时间条容器的样式:

.custom-timebar {
background-color: #f0f0f0;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

效果如下:

createGraph(
{
data: () => {
return {
nodes: [
{
id: 'node1',
style: { x: 100, y: 100, label: 'Node 1' },
data: {
timestamp: new Date('2023-08-01').getTime(),
},
},
{
id: 'node2',
style: { x: 200, y: 100, label: 'Node 2' },
data: {
timestamp: new Date('2023-08-01').getTime() + 3600 * 24 * 1000,
},
},
{
id: 'node3',
style: { x: 150, y: 200, label: 'Node 3' },
data: {
timestamp: new Date('2023-08-01').getTime() + 3600 * 24 * 1000 * 2,
},
},
],
edges: [
{ id: 'edge1', source: 'node1', target: 'node2' },
{ id: 'edge2', source: 'node2', target: 'node3' },
{ id: 'edge3', source: 'node3', target: 'node1' },
],
};
},
node: {
style: {
size: 20,
label: true,
},
},
edge: {
style: {
stroke: '#91d5ff',
lineWidth: 1,
},
},
plugins: [
{
type: 'timebar',
className: 'custom-timebar',
width: 400,
height: 80,
padding: [20, 20, 10, 20],
position: 'bottom',
data: [
{
time: new Date('2023-08-01').getTime(),
value: 5,
},
{
time: new Date('2023-08-01').getTime() + 3600 * 24 * 1000,
value: 10,
},
{
time: new Date('2023-08-01').getTime() + 3600 * 24 * 1000 * 2,
value: 15,
},
],
labelFormatter: (time) => {
return new Date(time).toLocaleDateString();
},
},
],
},
{ width: 600, height: 400 },
(gui, graph) => {
gui?.hide();
const style = document.createElement('style');
style.innerHTML = `
.custom-timebar {
background-color: #f0f0f0;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
`;
document.head.appendChild(style);
},
);

实际案例

  • 时间模式
  • 图表模式