Customization in React Sankey Chart component
18 Nov 201824 minutes to read
The Sankey Chart provides extensive customization options to create visualizations that match your specific design requirements and data presentation needs. From styling and theming to advanced visual techniques, the component enables complete control over appearance and behavior.
This guide covers comprehensive customization techniques including styling, theming, color mapping, and visual customization strategies.
Styling Overview
The Sankey Chart supports multiple levels of styling customization:
- Global Styling: Apply consistent styles to all elements
- Element-Level Styling: Customize specific nodes, links, or labels
- Data-Driven Styling: Apply styles based on data values or conditions
- Theme-Based Styling: Use predefined themes or create custom themes
Node and Link Styling
Global Node Styling
Apply consistent styling to all nodes using the nodeStyle property:
import * as React from "react";
import * as ReactDOM from "react-dom";
import { SankeyComponent, SankeyNodeDirective, SankeyNodesCollectionDirective, SankeyLinkDirective, SankeyLinksCollectionDirective, Inject, SankeyTooltip, SankeyLegend, SankeyExport } from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
nodeStyle={{
fill: '#4472C4',
opacity: 0.8,
border: { width: 2, color: '#2E5090' }
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id='Agricultural Waste' />
<SankeyNodeDirective id='Bio-conversion' />
<SankeyNodeDirective id='Liquid Biofuel' />
<SankeyNodeDirective id='Electricity' />
<SankeyNodeDirective id='Heat' />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId='Agricultural Waste' targetId='Bio-conversion' value={124.729} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Liquid Biofuel' value={0.597} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Electricity' value={26.862} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Heat' value={280.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import { SankeyComponent, SankeyNodeDirective, SankeyNodesCollectionDirective, SankeyLinkDirective, SankeyLinksCollectionDirective, Inject, SankeyTooltip, SankeyLegend, SankeyExport } from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
nodeStyle={{
fill: '#4472C4',
opacity: 0.8,
border: { width: 2, color: '#2E5090' }
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id='Agricultural Waste' />
<SankeyNodeDirective id='Bio-conversion' />
<SankeyNodeDirective id='Liquid Biofuel' />
<SankeyNodeDirective id='Electricity' />
<SankeyNodeDirective id='Heat' />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId='Agricultural Waste' targetId='Bio-conversion' value={124.729} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Liquid Biofuel' value={0.597} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Electricity' value={26.862} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Heat' value={280.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Global Link Styling
Configure link appearance using the linkStyle property:
import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent,
Inject,
SankeyTooltip,
SankeyLegend,
SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section">
<SankeyComponent
id="sankey-container"
width="90%"
height="450px"
linkStyle={{
opacity: 0.5,
curvature: 0.4
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent,
Inject,
SankeyTooltip,
SankeyLegend,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section">
<SankeyComponent
id="sankey-container"
width="90%"
height="450px"
linkStyle={{
opacity: 0.5,
curvature: 0.4
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Individual Element Customization
Custom Node Appearance
Customize individual nodes by setting properties on each node object:
import * as React from "react";
import * as ReactDOM from "react-dom";
import { SankeyComponent, SankeyNodeDirective, SankeyNodesCollectionDirective, SankeyLinkDirective, SankeyLinksCollectionDirective, Inject, SankeyTooltip, SankeyLegend, SankeyExport } from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id='Agricultural Waste' fill='#FF6B6B' />
<SankeyNodeDirective id='Bio-conversion' fill='#4ECDC4' />
<SankeyNodeDirective id='Liquid Biofuel' fill='#45B7D1' />
<SankeyNodeDirective id='Electricity' fill='#FFA07A' />
<SankeyNodeDirective id='Heat' fill='#98D8C8' />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId='Agricultural Waste' targetId='Bio-conversion' value={124.729} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Liquid Biofuel' value={0.597} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Electricity' value={26.862} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Heat' value={280.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import { SankeyComponent, SankeyNodeDirective, SankeyNodesCollectionDirective, SankeyLinkDirective, SankeyLinksCollectionDirective, Inject, SankeyTooltip, SankeyLegend, SankeyExport } from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id='Agricultural Waste' fill='#FF6B6B' />
<SankeyNodeDirective id='Bio-conversion' fill='#4ECDC4' />
<SankeyNodeDirective id='Liquid Biofuel' fill='#45B7D1' />
<SankeyNodeDirective id='Electricity' fill='#FFA07A' />
<SankeyNodeDirective id='Heat' fill='#98D8C8' />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId='Agricultural Waste' targetId='Bio-conversion' value={124.729} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Liquid Biofuel' value={0.597} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Electricity' value={26.862} />
<SankeyLinkDirective sourceId='Bio-conversion' targetId='Heat' value={280.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Custom Node Labels
Customize individual node labels with specific text, styling, and positioning:
import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
labelSettings={{
fontFamily: 'Segoe UI',
fontWeight: 'bold',
fontSize: '14px',
color: '#1a1a1a'
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
labelSettings={{
fontFamily: 'Segoe UI',
fontWeight: 'bold',
fontSize: '14px',
color: '#1a1a1a'
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Color Customization
Predefined Color Palettes
Apply predefined color palettes to automatically color nodes:
const nodes = [
{ id: 'Source1', label: { text: 'Source 1' }, color: '#3DA6D4' },
{ id: 'Source2', label: { text: 'Source 2' }, color: '#FFA500' },
{ id: 'Target', label: { text: 'Target' }, color: '#28A745' }
];Color Mapping
Map colors to specific categories or value ranges:
import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div>
<SankeyComponent
id="sankey-container"
width="90%"
height="450px"
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Theme Customization
Apply Theme
const theme = 'Material'; // or 'Fabric', 'Bootstrap', 'HighContrast'
return (
<SankeyChartComponent
theme={theme}
{...otherProps}
>
</SankeyChartComponent>
);Custom Theme Colors
import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
const customTheme = {
'nodeFill': '#5A5A5A',
'linkFill': '#B3B3B3'
};
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
nodeStyle={{ fill: customTheme.nodeFill }}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
const customTheme = {
'nodeFill': '#5A5A5A',
'linkFill': '#B3B3B3'
};
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
nodeStyle={{ fill: customTheme.nodeFill }}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Tooltip Customization
Template-Based Tooltips
Create custom tooltip templates for rich content:
import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent,
Inject,
SankeyTooltip,
SankeyLegend,
SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section">
<SankeyComponent
id="sankey-container"
width="90%"
height="450px"
tooltip={{
enable: true,
nodeFormat: '<div style="padding:10px"><b>${sourceNodeName} → ${targetNodeName}</b><br/>Value: ${value}</div>'
}}
><SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent,
Inject,
SankeyTooltip,
SankeyLegend,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section">
<SankeyComponent
id="sankey-container"
width="90%"
height="450px"
tooltip={{
enable: true,
linkFormat: '<div style="padding:10px"><b>${sourceNodeName} → ${targetNodeName}</b><br/>Value: ${value}</div>'
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" />
<SankeyNodeDirective id="Liquid Biofuel" />
<SankeyNodeDirective id="Electricity" />
<SankeyNodeDirective id="Heat" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));Advanced Customization Patterns
Conditional Styling Based on Data
Apply different styles based on data conditions or value ranges:
const onNodeRendering = (args) => {
const value = args.node.value || 0;
if (value > 200) {
args.node.color = '#00A651'; // High flow - green
} else if (value > 100) {
args.node.color = '#FFB81C'; // Medium flow - orange
} else {
args.node.color = '#E81B23'; // Low flow - red
}
};Category-Based Styling
Assign colors and styles based on node categories:
const categoryColors = {
'Energy': '#FF6B6B',
'Transport': '#4ECDC4',
'Industry': '#95E1D3',
'Residential': '#FFD93D'
};
const onNodeRendering = (args) => {
const category = extractCategory(args.node.id);
args.node.color = categoryColors[category] || '#999';
};Interactive Styling
Apply different styles for hover and focus states:
const onNodeEnter = (args) => {
// Highlight node on hover
args.node.highlightOpacity = 1;
};
const onNodeLeave = (args) => {
// Reset to normal state
args.node.highlightOpacity = 0.3;
};Performance Optimization
Large Dataset Customization
For charts with many nodes and links, optimize rendering performance:
-
Use Global Styles: Apply global
nodeStyleandlinkStyleinstead of individual customization - Minimize Calculations: Reduce complex calculations in rendering events
- Conditional Rendering: Only customize visible elements in viewport
- Cache Results: Cache computed styles and colors
Customization Best Practices
Key Considerations
-
Consistency
- Maintain consistent color schemes across nodes and links
- Use meaningful colors that represent data categories
- Apply visual hierarchy through size and opacity
-
Performance
- Avoid complex calculations in rendering events
- Use global styles when possible
- Optimize for large datasets
-
Accessibility
- Don’t rely solely on color for information
- Ensure sufficient contrast ratios
- Provide alternative representations
-
User Experience
- Use intuitive color mapping
- Provide clear visual feedback for interactions
- Maintain visual consistency with your application
-
Maintainability
- Document custom styling logic
- Use reusable style functions
- Separate styling from business logic
Example: Comprehensive Customization
import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
title="Comprehensive Sankey Customization"
margin={{ left: 40, right: 40, top: 40, bottom: 40 }}
nodeStyle={{ opacity: 0.85 }}
linkStyle={{ opacity: 0.6, curvature: 0.5 }}
labelSettings={{
fontWeight: 'bold'
}}
tooltip={{
enable: true,
nodeFormat: '<b>${sourceNodeName} → ${targetNodeName}</b><br/>Value: ${value}'
}}
legendSettings={{
visible: true,
position: 'Bottom'
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" color="#FF6B6B" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" color="#4ECDC4" />
<SankeyNodeDirective id="Liquid Biofuel" color="#45B7D1" />
<SankeyNodeDirective id="Electricity" color="#FFA07A" />
<SankeyNodeDirective id="Heat" color="#98D8C8" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));import * as React from "react";
import * as ReactDOM from "react-dom";
import {
SankeyComponent, Inject, SankeyTooltip, SankeyLegend, SankeyExport,
SankeyNodeDirective,
SankeyNodesCollectionDirective,
SankeyLinkDirective,
SankeyLinksCollectionDirective
} from '@syncfusion/ej2-react-charts';
function App() {
return (
<div className="control-pane">
<div className="control-section" id="sankey-container">
<SankeyComponent
width="90%"
height="450px"
title="Comprehensive Sankey Customization"
margin={{ left: 40, right: 40, top: 40, bottom: 40 }}
nodeStyle={{ opacity: 0.85 }}
linkStyle={{ opacity: 0.6, curvature: 0.5 }}
labelSettings={{
fontWeight: 'bold'
}}
tooltip={{
enable: true,
nodeFormat: '<b>${sourceNodeName} → ${targetNodeName}</b><br/>Value: ${value}'
}}
legendSettings={{
visible: true,
position: 'Bottom'
}}
>
<SankeyNodesCollectionDirective>
<SankeyNodeDirective id="Agricultural Waste" color="#FF6B6B" />
<SankeyNodeDirective id="Biomass Residues" />
<SankeyNodeDirective id="Bio-conversion" color="#4ECDC4" />
<SankeyNodeDirective id="Liquid Biofuel" color="#45B7D1" />
<SankeyNodeDirective id="Electricity" color="#FFA07A" />
<SankeyNodeDirective id="Heat" color="#98D8C8" />
</SankeyNodesCollectionDirective>
<SankeyLinksCollectionDirective>
<SankeyLinkDirective sourceId="Agricultural Waste" targetId="Bio-conversion" value={84.152} />
<SankeyLinkDirective sourceId="Biomass Residues" targetId="Bio-conversion" value={24.152} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Liquid Biofuel" value={10.597} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Electricity" value={36.862} />
<SankeyLinkDirective sourceId="Bio-conversion" targetId="Heat" value={60.845} />
</SankeyLinksCollectionDirective>
<Inject services={[SankeyTooltip, SankeyLegend, SankeyExport]} />
</SankeyComponent>
</div>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('sankey'));