Orientation and RTL in JavaScript Sankey Chart component
18 Nov 201814 minutes to read
The Sankey Chart supports flexible layout options including horizontal and vertical orientations, as well as right-to-left (RTL) rendering for international applications. These features enable you to create localized and directionally appropriate visualizations.
This guide covers orientation options and RTL configuration for different languages and reading directions.
Orientation
Control the layout direction of the Sankey Chart using the orientation property. The orientation determines how nodes are arranged and how links flow through the diagram.
Orientation Options
| Option | Description |
|---|---|
| ‘Horizontal’ | Nodes flow from left to right. Links flow horizontally between nodes. (Default) |
| ‘Vertical’ | Nodes flow from top to bottom. Links flow vertically between nodes. |
Horizontal Orientation
The default orientation displays nodes horizontally across the chart, with flows moving from left to right. This is the standard layout for most Sankey diagrams:
const nodes = [
{ id: 'Agricultural Waste' },
{ id: 'Biomass Residues' },
{ id: 'Bio-conversion' },
{ id: 'Liquid Biofuel' },
{ id: 'Electricity' },
{ id: 'Heat' }
];
const links = [
{ sourceId: 'Agricultural Waste', targetId: 'Bio-conversion', value: 84.152 },
{ sourceId: 'Biomass Residues', targetId: 'Bio-conversion', value: 24.152 },
{ sourceId: 'Bio-conversion', targetId: 'Liquid Biofuel', value: 10.597 },
{ sourceId: 'Bio-conversion', targetId: 'Electricity', value: 36.862 },
{ sourceId: 'Bio-conversion', targetId: 'Heat', value: 60.845 }
];
const sankey = new ej.charts.Sankey(
{
width: '90%',
height: '450px',
orientation: 'Horizontal',
nodes: nodes,
links: links,
tooltip: { enable: true },
legendSettings: { visible: true }
},
'#sankey-container'
);<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Typescript UI Controls">
<meta name="author" content="Syncfusion">
<link href="index.css" rel="stylesheet">
<script src="https://cdn.syncfusion.com/ej2/34.1.29/dist/ej2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="sankey-container"></div>
</div>
<script>
var ele = document.getElementById('container');
if (ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body>
</html>Vertical Orientation
Display nodes vertically with flows moving from top to bottom. This layout is useful for depicting hierarchical relationships or processes that flow downward:
const nodes = [
{ id: 'Agricultural Waste' },
{ id: 'Biomass Residues' },
{ id: 'Bio-conversion' },
{ id: 'Liquid Biofuel' },
{ id: 'Electricity' },
{ id: 'Heat' }
];
const links = [
{ sourceId: 'Agricultural Waste', targetId: 'Bio-conversion', value: 84.152 },
{ sourceId: 'Biomass Residues', targetId: 'Bio-conversion', value: 24.152 },
{ sourceId: 'Bio-conversion', targetId: 'Liquid Biofuel', value: 10.597 },
{ sourceId: 'Bio-conversion', targetId: 'Electricity', value: 36.862 },
{ sourceId: 'Bio-conversion', targetId: 'Heat', value: 60.845 }
];
const sankey = new ej.charts.Sankey(
{
width: '90%',
height: '450px',
orientation: 'Vertical',
nodes: nodes,
links: links,
tooltip: { enable: true },
legendSettings: { visible: true }
},
'#sankey-container'
);<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Typescript UI Controls">
<meta name="author" content="Syncfusion">
<link href="index.css" rel="stylesheet">
<script src="https://cdn.syncfusion.com/ej2/34.1.29/dist/ej2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="sankey-container"></div>
</div>
<script>
var ele = document.getElementById('container');
if (ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body>
</html>Right-to-Left (RTL) Support
Enable RTL rendering for languages that read from right to left (such as Arabic, Hebrew, and Persian) using the enableRtl property. RTL mode reverses the horizontal flow direction and mirrors the layout:
const nodes = [
{ id: 'Agricultural Waste' },
{ id: 'Biomass Residues' },
{ id: 'Bio-conversion' },
{ id: 'Liquid Biofuel' },
{ id: 'Electricity' },
{ id: 'Heat' }
];
const links = [
{ sourceId: 'Agricultural Waste', targetId: 'Bio-conversion', value: 84.152 },
{ sourceId: 'Biomass Residues', targetId: 'Bio-conversion', value: 24.152 },
{ sourceId: 'Bio-conversion', targetId: 'Liquid Biofuel', value: 10.597 },
{ sourceId: 'Bio-conversion', targetId: 'Electricity', value: 36.862 },
{ sourceId: 'Bio-conversion', targetId: 'Heat', value: 60.845 }
];
const sankey = new ej.charts.Sankey(
{
width: '90%',
height: '450px',
enableRtl: true,
nodes: nodes,
links: links,
tooltip: { enable: true },
legendSettings: { visible: true }
},
'#sankey-container'
);<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Typescript UI Controls">
<meta name="author" content="Syncfusion">
<link href="index.css" rel="stylesheet">
<script src="https://cdn.syncfusion.com/ej2/34.1.29/dist/ej2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="sankey-container"></div>
</div>
<script>
var ele = document.getElementById('container');
if (ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body>
</html>RTL with Horizontal Orientation
Combining RTL mode with horizontal orientation creates a right-to-left flow layout. Nodes flow from right to left, and labels are right-aligned, making it suitable for RTL languages:
const nodes = [
{ id: 'Agricultural Waste' },
{ id: 'Biomass Residues' },
{ id: 'Bio-conversion' },
{ id: 'Liquid Biofuel' },
{ id: 'Electricity' },
{ id: 'Heat' }
];
const links = [
{ sourceId: 'Agricultural Waste', targetId: 'Bio-conversion', value: 84.152 },
{ sourceId: 'Biomass Residues', targetId: 'Bio-conversion', value: 24.152 },
{ sourceId: 'Bio-conversion', targetId: 'Liquid Biofuel', value: 10.597 },
{ sourceId: 'Bio-conversion', targetId: 'Electricity', value: 36.862 },
{ sourceId: 'Bio-conversion', targetId: 'Heat', value: 60.845 }
];
const sankey = new ej.charts.Sankey(
{
width: '90%',
height: '450px',
orientation: 'Horizontal',
enableRtl: true,
nodes: nodes,
links: links,
tooltip: { enable: true },
legendSettings: { visible: true }
},
'#sankey-container'
);<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Typescript UI Controls">
<meta name="author" content="Syncfusion">
<link href="index.css" rel="stylesheet">
<script src="https://cdn.syncfusion.com/ej2/34.1.29/dist/ej2.min.js" type="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="sankey-container"></div>
</div>
<script>
var ele = document.getElementById('container');
if (ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body>
</html>RTL Effects on Layout
When RTL is enabled:
- Nodes flow from right to left in horizontal orientation
- Legend positions are mirrored
- Labels and text are right-aligned
- Tooltips and menus adjust to RTL layout
- All UI elements adapt to right-to-left reading order
Best Practices
- Use RTL when targeting languages like Arabic, Hebrew, Persian, or Urdu
- Test layouts in both LTR and RTL modes to ensure proper spacing and readability
- Combine orientation and RTL settings based on your specific visualization needs
- Ensure all labels and text content support the target language and character encoding