logo

G6

  • Docs
  • API
  • Playground
  • Community
  • Productsantv logo arrow
  • 5.0.49
  • Introduction
  • Data
  • Getting Started
    • Quick Start
    • Installation
    • Integration
      • react
      • vue
      • angular
    • Step-by-step guide
  • Graph
    • Extensions En
    • Graph
    • Options
    • extension
  • Element
    • Element Overview
    • Element State
    • Node
      • Node Overview
      • Common Node Configuration
      • Circle Node
      • Diamond Node
      • Donut Node
      • Ellipse Node
      • Hexagon Node
      • HTML Node
      • Image Node
      • Rect Node
      • Star Node
      • Triangle Node
      • Custom Node
      • Define Nodes with React
    • Edge
      • Edge Overview
      • Edge Common Configuration
      • Cubic Bezier Curve Edge
      • CubicHorizontal Bezier Curve Edge
      • CubicVertical Bezier Curve Edge
      • Line Edge
      • Polyline Edge
      • Quadratic Bezier Curve Edge
      • Custom Edge
    • Combo
      • Combo Overview
      • Combo Common Options
      • Circle Combo
      • Rect Combo
      • Custom Combo
    • Shape
      • Shape and KeyShape
      • Atomic Shapes and Their Properties
      • Design and Implementation of Composite Shape
  • Layout
    • Layout Overview
    • Common Layout Configuration Options
    • AntvDagre Layout
    • Circular Layout
    • ComboCombined Layout
    • CompactBox Layout
    • Concentric Layout
    • 3D Force-Directed Layout
    • D3 Force-Directed Layout
    • Dagre Layout
    • Dendrogram Layout
    • Fishbone Layout
    • ForceAtlas2 Force-directed Layout
    • Force-directed Layout
    • Fruchterman Force-directed Layout
    • Grid Layout
    • Indented Tree
    • MDS High-dimensional Data Dimensionality Reduction Layout
    • Mindmap Tree
    • Radial Layout
    • Random Layout
    • Snake Layout
    • Custom Layout
  • Behavior
    • Behavior Overview
    • ZoomCanvas
    • AutoAdaptLabel
    • BrushSelect
    • ClickSelect
    • CollapseExpand
    • CreateEdge
    • DragCanvas
    • DragElement
    • DragElementForce
    • FixElementSize
    • FocusElement
    • HoverActivate
    • LassoSelect
    • OptimizeViewportTransform
    • ScrollCanvas
    • Custom Behavior
  • Plugin
    • Plugin Overview
    • Background
    • BubbleSets
    • Contextmenu
    • EdgeBundling
    • EdgeFilterLens
    • Fisheye
    • Fullscreen
    • GridLine
    • History
    • Hull
    • Legend
    • Minimap
    • Snapline
    • Timebar
    • Toolbar
    • Tooltip
    • Watermark
    • Custom Plugin
  • Transform
    • Data Transformation Overview
    • MapNodeSize
    • PlaceRadialLabels
    • ProcessParallelEdges
    • Custom Transform
  • Theme
    • Theme Overview
    • Custom Theme
    • Palette
    • Custom Palette
  • Animation
    • Animation Overview
    • Custom Animation
  • Further Reading
    • Event
    • renderer
    • coordinate
    • download-image
    • Using Iconfont
    • Use 3D
    • Bundle Project
  • What's new
    • Feature
    • Upgrade To 5.0
  • FAQ
  • contribute

Donut Node

Previous
Diamond Node
Next
Ellipse Node

Resource

Ant Design
Galacea Effects
Umi-React Application Framework
Dumi-Component doc generator
ahooks-React Hooks Library

Community

Ant Financial Experience Tech
seeconfSEE Conf-Experience Tech Conference

Help

GitHub
StackOverflow

more productsMore Productions

Ant DesignAnt Design-Enterprise UI design language
yuqueYuque-Knowledge creation and Sharing tool
EggEgg-Enterprise-class Node development framework
kitchenKitchen-Sketch Tool set
GalaceanGalacean-Interactive solution
xtechLiven Experience technology
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

Overview

The donut node is a ring-shaped geometric figure composed of two concentric circles.

Applicable scenarios:

  • Used to represent proportional data, such as completion progress and ratio analysis.

  • Suitable for representing multi-layered data, such as nested ring charts.

  • Commonly used in data visualization, dashboards, progress charts, etc.

Online Experience

createGraph(
{
autoFit: 'center',
data: {
nodes: [
{
id: 'node1',
style: {
fill: 'transparent',
size: 60,
donuts: [30, 30, 20, 20],
donutPalette: ['#1783FF', '#00C9C9', '#F08F56', '#D580FF'],
},
},
],
},
node: { type: 'donut' },
plugins: [{ type: 'grid-line', size: 30 }],
},
{ width: 600, height: 220 },
(gui, graph) => {
gui.add({ type: 'donut' }, 'type').disable();
const options = {
size: 60,
innerR: 50,
donutPalette: ['#1783FF', '#00C9C9', '#F08F56', '#D580FF'],
};
const optionFolder = gui.addFolder('donut.style');
optionFolder.add(options, 'size', 0, 100, 1);
optionFolder.add(options, 'innerR', 0, 100, 1).name('innerR(%)');
optionFolder.add(options, 'donutPalette', ['spectral', 'tableau', ['#1783FF', '#00C9C9', '#F08F56', '#D580FF']]);
optionFolder.onChange(({ property, value }) => {
if (property === 'innerR') value = value + '%';
graph.updateNodeData([{ id: 'node1', style: { [property]: value } }]);
graph.render();
});
},
);

设置 node.type 为 donut 以使用甜甜圈节点。

Style Configuration

If the element has specific attributes, we will list them below. For all general style attributes, see BaseNode

AttributeDescriptionTypeDefaultRequired
donutFillFill colorstring#1783FF
donutFillOpacityFill color opacitynumber | string1
donutLineCapStroke end styleround | square | buttbutt
donutLineDashStroke dash stylenumber[]-
donutLineDashOffsetStroke dash offsetnumber-
donutLineJoinStroke join styleround | bevel | mitermiter
donutLineWidthStroke widthnumber1
donutOpacityOpacitynumber | string1
donutPaletteColor or palette namestring | string[]tableau
donutsDonut datanumber[] | DonutRound[]-
donutShadowBlurShadow blurnumber-
donutShadowColorShadow colorstring-
donutShadowOffsetXShadow offset in x-axis directionnumber | string-
donutShadowOffsetYShadow offset in y-axis directionnumber | string-
donutShadowTypeShadow typeinner | outerouter
donutStrokeStroke colorstring#000
donutStrokeOpacityStroke color opacitynumber | string1
donutVisibilityVisibility of the shapevisible | hiddenvisible
innerRInner ring radius, percentage or pxstring | number50%

DonutRound

AttributeDescriptionTypeDefaultRequired
colorColorstring-
fillFill colorstring#1783FF
fillOpacityFill color opacitynumber | string1
lineCapStroke end styleround | square | buttbutt
lineDashStroke dash stylenumber[]-
lineDashOffsetStroke dash offsetnumber-
lineJoinStroke join styleround | bevel | mitermiter
lineWidthStroke widthnumber1
opacityOpacitynumber | string1
shadowBlurShadow blurnumber-
shadowColorShadow colorstring-
shadowOffsetXShadow offset in x-axis directionnumber | string-
shadowOffsetYShadow offset in y-axis directionnumber | string-
shadowTypeShadow typeinner | outerouter
strokeStroke colorstring#000
strokeOpacityStroke color opacitynumber | string1
valueValue for ratio calculationnumber-✓
visibilityVisibility of the shapevisible | hiddenvisible

Example

Built-in Donut Node Effect

import { Graph, iconfont } from '@antv/g6';
const style = document.createElement('style');
style.innerHTML = `@import url('${iconfont.css}');`;
document.head.appendChild(style);
const data = {
nodes: [
{ id: 'default', index: 0 },
{ id: 'halo', index: 1 },
{ id: 'badges', index: 2 },
{ id: 'ports', index: 3 },
{
id: 'active',
states: ['active'],
index: 4,
},
{
id: 'selected',
states: ['selected'],
index: 5,
},
{
id: 'highlight',
states: ['highlight'],
index: 6,
},
{
id: 'inactive',
states: ['inactive'],
index: 7,
},
{
id: 'disabled',
states: ['disabled'],
index: 8,
},
],
};
const graph = new Graph({
container: 'container',
animation: false,
data,
node: {
type: 'donut',
style: {
size: 80,
fill: '#DB9D0D',
innerR: 20,
donuts: (item) => {
const { index } = item;
if (index === 0) return [1, 2, 3]; // donuts数据类型为number[]时,根据值的大小决定环的占比
if (index === 1) {
return [
{ value: 50, color: 'red' },
{ value: 150, color: 'green' },
{ value: 100, color: 'blue' },
];
}
if (index === 4) {
return [
{ value: 150, fill: 'pink', stroke: '#fff', lineWidth: 1 },
{ value: 250, stroke: '#fff', lineWidth: 1 },
{ value: 200, stroke: '#fff', lineWidth: 1 },
];
}
return [100, 200, 100, 200];
},
labelText: (d) => d.id,
iconFontFamily: 'iconfont',
iconText: '\ue602',
halo: (d) => (d.id === 'halo' ? true : false),
badges: (d) =>
d.id === 'badges'
? [
{
text: 'A',
placement: 'right-top',
},
{
text: 'Important',
placement: 'right',
},
{
text: 'Notice',
placement: 'right-bottom',
},
]
: [],
badgeFontSize: 8,
badgePadding: [1, 4],
portR: 3,
ports: (d) =>
d.id === 'ports'
? [{ placement: 'left' }, { placement: 'right' }, { placement: 'top' }, { placement: 'bottom' }]
: [],
},
},
layout: {
type: 'grid',
},
});
graph.render();