Legend in Vue Sankey Chart component
18 Nov 201824 minutes to read
A legend provides a visual key that helps users understand the categories and meanings represented by nodes in the Sankey Chart. The Sankey Chart provides comprehensive legend configuration options including positioning, styling, customization, and interactive behaviors. You can enable and customize the legend using the legend property and by injecting the SankeyLegend module.
This guide covers legend configuration, positioning strategies, customization options, and dynamic legend rendering events.
Legend Settings Properties
The legendSettings property provides comprehensive options to configure legend appearance, behavior, and positioning. The following properties are commonly used:
Legend Configuration Properties
| Property | Type | Default | Description |
|---|---|---|---|
| visible | boolean | true | Shows or hides the legend. |
| position | string | ‘Auto’ | Position of the legend (Auto, Top, Bottom, Left, Right, Custom). |
| width | string | null | Width of the legend container. |
| height | string | null | Height of the legend container. |
| shapeWidth | number | 10 | Width of the legend shape (icon). |
| shapeHeight | number | 10 | Height of the legend shape (icon). |
| padding | number | 8 | Padding around the legend container. |
| itemPadding | number | null | Padding between legend items. |
| shapePadding | number | 8 | Padding between the legend shape and its text. |
| background | string | ‘transparent’ | Background color of the legend. |
| opacity | number | 1 | Opacity of the legend container (0 to 1). |
| title | string | null | Title text for the legend. |
| enableHighlight | boolean | true | Enables highlighting of related nodes/links when a legend item is clicked. |
| isInversed | boolean | false | Inverts the legend layout. |
Enable the legend and configure its basic properties such as visibility, position, and sizing. By default, the legend is automatically positioned based on available space.
Basic Legend Configuration
Here is an example of enabling and customizing the legend:
<template>
<div class="control-pane">
<div class="control-section" id="sankey-container">
<EjsSankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<ESankeyNodesCollection>
<ESankeyNode id="Agricultural Waste" />
<ESankeyNode id="Biomass Residues" />
<ESankeyNode id="Bio-conversion" />
<ESankeyNode id="Liquid Biofuel" />
<ESankeyNode id="Electricity" />
<ESankeyNode id="Heat" />
</ESankeyNodesCollection>
<ESankeyLinksCollection>
<ESankeyLink sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<ESankeyLink sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<ESankeyLink sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<ESankeyLink sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<ESankeyLink sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</ESankeyLinksCollection>
</EjsSankey>
</div>
</div>
</template>
<script setup>
import { provide } from "vue";
import {
SankeyComponent as EjsSankey,
SankeyNodesCollectionDirective as ESankeyNodesCollection,
SankeyNodeDirective as ESankeyNode,
SankeyLinksCollectionDirective as ESankeyLinksCollection,
SankeyLinkDirective as ESankeyLink,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
const legendSettings = {
visible: true,
position: "Right"
};
provide("sankey", [SankeyTooltip, SankeyLegend, SankeyExport]);
</script>
<style>
#sankey-container {
height: 450px;
}
</style><template>
<div id="app" class="control-pane">
<div class="control-section" id="sankey-container">
<ejs-sankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<e-sankey-nodes-collection>
<e-sankey-node id="Agricultural Waste" />
<e-sankey-node id="Biomass Residues" />
<e-sankey-node id="Bio-conversion" />
<e-sankey-node id="Liquid Biofuel" />
<e-sankey-node id="Electricity" />
<e-sankey-node id="Heat" />
</e-sankey-nodes-collection>
<e-sankey-links-collection>
<e-sankey-link sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<e-sankey-link sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<e-sankey-link sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<e-sankey-link sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<e-sankey-link sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</e-sankey-links-collection>
</ejs-sankey>
</div>
</div>
</template>
<script>
import {
SankeyComponent,
SankeyNodesCollectionDirective,
SankeyNodeDirective,
SankeyLinksCollectionDirective,
SankeyLinkDirective,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
export default {
name: "App",
components: {
"ejs-sankey": SankeyComponent,
"e-sankey-nodes-collection": SankeyNodesCollectionDirective,
"e-sankey-node": SankeyNodeDirective,
"e-sankey-links-collection": SankeyLinksCollectionDirective,
"e-sankey-link": SankeyLinkDirective
},
data() {
return {
legendSettings: {
visible: true,
position: "Right"
}
};
},
provide: {
sankey: [SankeyTooltip, SankeyLegend, SankeyExport]
}
};
</script>
<style>
#sankey-container {
height: 450px;
}
</style>Legend Position
Control the legend position using the position property with the following options:
- ‘Top’: Legend appears above the Sankey Chart
- ‘Bottom’: Legend appears below the Sankey Chart
- ‘Left’: Legend appears to the left of the chart
- ‘Right’: Legend appears to the right of the chart (default for most cases)
- ‘Auto’: Automatically positions the legend based on available space
-
‘Custom’: Allows you to specify custom coordinates using the
locationproperty
<template>
<div class="control-pane">
<div class="control-section" id="sankey-container">
<EjsSankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<ESankeyNodesCollection>
<ESankeyNode id="Agricultural Waste" />
<ESankeyNode id="Biomass Residues" />
<ESankeyNode id="Bio-conversion" />
<ESankeyNode id="Liquid Biofuel" />
<ESankeyNode id="Electricity" />
<ESankeyNode id="Heat" />
</ESankeyNodesCollection>
<ESankeyLinksCollection>
<ESankeyLink sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<ESankeyLink sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<ESankeyLink sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<ESankeyLink sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<ESankeyLink sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</ESankeyLinksCollection>
</EjsSankey>
</div>
</div>
</template>
<script setup>
import { provide } from "vue";
import {
SankeyComponent as EjsSankey,
SankeyNodesCollectionDirective as ESankeyNodesCollection,
SankeyNodeDirective as ESankeyNode,
SankeyLinksCollectionDirective as ESankeyLinksCollection,
SankeyLinkDirective as ESankeyLink,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
const legendSettings = {
visible: true,
position: "Bottom"
};
provide("sankey", [SankeyTooltip, SankeyLegend, SankeyExport]);
</script>
<style>
#sankey-container {
height: 450px;
}
</style><template>
<div id="app" class="control-pane">
<div class="control-section" id="sankey-container">
<ejs-sankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<e-sankey-nodes-collection>
<e-sankey-node id="Agricultural Waste" />
<e-sankey-node id="Biomass Residues" />
<e-sankey-node id="Bio-conversion" />
<e-sankey-node id="Liquid Biofuel" />
<e-sankey-node id="Electricity" />
<e-sankey-node id="Heat" />
</e-sankey-nodes-collection>
<e-sankey-links-collection>
<e-sankey-link sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<e-sankey-link sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<e-sankey-link sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<e-sankey-link sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<e-sankey-link sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</e-sankey-links-collection>
</ejs-sankey>
</div>
</div>
</template>
<script>
import {
SankeyComponent,
SankeyNodesCollectionDirective,
SankeyNodeDirective,
SankeyLinksCollectionDirective,
SankeyLinkDirective,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
export default {
name: "App",
components: {
"ejs-sankey": SankeyComponent,
"e-sankey-nodes-collection": SankeyNodesCollectionDirective,
"e-sankey-node": SankeyNodeDirective,
"e-sankey-links-collection": SankeyLinksCollectionDirective,
"e-sankey-link": SankeyLinkDirective
},
data() {
return {
legendSettings: {
visible: true,
position: "Bottom"
}
};
},
provide: {
sankey: [SankeyTooltip, SankeyLegend, SankeyExport]
}
};
</script>
<style>
#sankey-container {
height: 450px;
}
</style>Customize the legend appearance with properties like background color, opacity, shape sizing, padding, and interactive highlighting. The following example demonstrates comprehensive legend styling:
Customized Legend
Here is an example with comprehensive legend customization:
<template>
<div class="control-pane">
<div class="control-section" id="sankey-container">
<EjsSankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<ESankeyNodesCollection>
<ESankeyNode id="Agricultural Waste" />
<ESankeyNode id="Biomass Residues" />
<ESankeyNode id="Bio-conversion" />
<ESankeyNode id="Liquid Biofuel" />
<ESankeyNode id="Electricity" />
<ESankeyNode id="Heat" />
</ESankeyNodesCollection>
<ESankeyLinksCollection>
<ESankeyLink sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<ESankeyLink sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<ESankeyLink sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<ESankeyLink sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<ESankeyLink sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</ESankeyLinksCollection>
</EjsSankey>
</div>
</div>
</template>
<script setup>
import { provide } from "vue";
import {
SankeyComponent as EjsSankey,
SankeyNodesCollectionDirective as ESankeyNodesCollection,
SankeyNodeDirective as ESankeyNode,
SankeyLinksCollectionDirective as ESankeyLinksCollection,
SankeyLinkDirective as ESankeyLink,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
const legendSettings = {
visible: true,
position: "Right",
border: { width: 2, color: "#333" },
background: "#f5f5f5",
textStyle: {
fontFamily: "Segoe UI",
fontStyle: "Normal",
fontWeight: "500",
size: "13px"
},
itemPadding: 12
};
provide("sankey", [SankeyTooltip, SankeyLegend, SankeyExport]);
</script>
<style>
#sankey-container {
height: 450px;
}
</style><template>
<div id="app" class="control-pane">
<div class="control-section" id="sankey-container">
<ejs-sankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<e-sankey-nodes-collection>
<e-sankey-node id="Agricultural Waste" />
<e-sankey-node id="Biomass Residues" />
<e-sankey-node id="Bio-conversion" />
<e-sankey-node id="Liquid Biofuel" />
<e-sankey-node id="Electricity" />
<e-sankey-node id="Heat" />
</e-sankey-nodes-collection>
<e-sankey-links-collection>
<e-sankey-link sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<e-sankey-link sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<e-sankey-link sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<e-sankey-link sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<e-sankey-link sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</e-sankey-links-collection>
</ejs-sankey>
</div>
</div>
</template>
<script>
import {
SankeyComponent,
SankeyNodesCollectionDirective,
SankeyNodeDirective,
SankeyLinksCollectionDirective,
SankeyLinkDirective,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
export default {
name: "App",
components: {
"ejs-sankey": SankeyComponent,
"e-sankey-nodes-collection": SankeyNodesCollectionDirective,
"e-sankey-node": SankeyNodeDirective,
"e-sankey-links-collection": SankeyLinksCollectionDirective,
"e-sankey-link": SankeyLinkDirective
},
data() {
return {
legendSettings: {
visible: true,
position: "Right",
border: { width: 2, color: "#333" },
background: "#f5f5f5",
textStyle: {
fontFamily: "Segoe UI",
fontStyle: "Normal",
fontWeight: "500",
size: "13px"
},
itemPadding: 12
}
};
},
provide: {
sankey: [SankeyTooltip, SankeyLegend, SankeyExport]
}
};
</script>
<style>
#sankey-container {
height: 450px;
}
</style>Custom Legend Position
Position the legend at a specific location using the Custom position setting. When using Custom position, specify the exact X and Y coordinates where the legend should appear. This provides precise control over legend placement:
<template>
<div class="control-pane">
<div class="control-section" id="sankey-container">
<EjsSankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<ESankeyNodesCollection>
<ESankeyNode id="Agricultural Waste" />
<ESankeyNode id="Biomass Residues" />
<ESankeyNode id="Bio-conversion" />
<ESankeyNode id="Liquid Biofuel" />
<ESankeyNode id="Electricity" />
<ESankeyNode id="Heat" />
</ESankeyNodesCollection>
<ESankeyLinksCollection>
<ESankeyLink sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<ESankeyLink sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<ESankeyLink sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<ESankeyLink sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<ESankeyLink sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</ESankeyLinksCollection>
</EjsSankey>
</div>
</div>
</template>
<script setup>
import { provide } from "vue";
import {
SankeyComponent as EjsSankey,
SankeyNodesCollectionDirective as ESankeyNodesCollection,
SankeyNodeDirective as ESankeyNode,
SankeyLinksCollectionDirective as ESankeyLinksCollection,
SankeyLinkDirective as ESankeyLink,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
const legendSettings = {
visible: true,
position: "Custom",
location: { x: 120, y: 150 },
height: "150px",
width: "150px"
};
provide("sankey", [SankeyLegend, SankeyExport]);
</script>
<style>
#sankey-container {
height: 450px;
}
</style><template>
<div id="app" class="control-pane">
<div class="control-section" id="sankey-container">
<ejs-sankey
width="90%"
height="450px"
:legendSettings="legendSettings"
>
<e-sankey-nodes-collection>
<e-sankey-node id="Agricultural Waste" />
<e-sankey-node id="Biomass Residues" />
<e-sankey-node id="Bio-conversion" />
<e-sankey-node id="Liquid Biofuel" />
<e-sankey-node id="Electricity" />
<e-sankey-node id="Heat" />
</e-sankey-nodes-collection>
<e-sankey-links-collection>
<e-sankey-link sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<e-sankey-link sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<e-sankey-link sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<e-sankey-link sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<e-sankey-link sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</e-sankey-links-collection>
</ejs-sankey>
</div>
</div>
</template>
<script>
import {
SankeyComponent,
SankeyNodesCollectionDirective,
SankeyNodeDirective,
SankeyLinksCollectionDirective,
SankeyLinkDirective,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
export default {
name: "App",
components: {
"ejs-sankey": SankeyComponent,
"e-sankey-nodes-collection": SankeyNodesCollectionDirective,
"e-sankey-node": SankeyNodeDirective,
"e-sankey-links-collection": SankeyLinksCollectionDirective,
"e-sankey-link": SankeyLinkDirective
},
data() {
return {
legendSettings: {
visible: true,
position: "Custom",
location: { x: 120, y: 150 },
height: "150px",
width: "150px"
}
};
},
provide: {
sankey: [SankeyLegend, SankeyExport]
}
};
</script>
<style>
#sankey-container {
height: 450px;
}
</style>Advanced Legend Configuration
Dynamic Legend Customization
Use the legendItemRendering event to customize individual legend items before they are rendered. This event is triggered for each legend item and allows you to apply conditional styling, modify colors, or change text based on data values:
<template>
<div class="control-pane">
<div class="control-section" id="sankey-container">
<EjsSankey
width="90%"
height="450px"
:legendSettings="legendSettings"
:legendItemRendering="onLegendItemRendering"
>
<ESankeyNodesCollection>
<ESankeyNode id="Agricultural Waste" />
<ESankeyNode id="Biomass Residues" />
<ESankeyNode id="Bio-conversion" />
<ESankeyNode id="Liquid Biofuel" />
<ESankeyNode id="Electricity" />
<ESankeyNode id="Heat" />
</ESankeyNodesCollection>
<ESankeyLinksCollection>
<ESankeyLink sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<ESankeyLink sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<ESankeyLink sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<ESankeyLink sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<ESankeyLink sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</ESankeyLinksCollection>
</EjsSankey>
</div>
</div>
</template>
<script setup>
import { provide } from "vue";
import {
SankeyComponent as EjsSankey,
SankeyNodesCollectionDirective as ESankeyNodesCollection,
SankeyNodeDirective as ESankeyNode,
SankeyLinksCollectionDirective as ESankeyLinksCollection,
SankeyLinkDirective as ESankeyLink,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
const legendSettings = {
visible: true,
position: "Bottom"
};
function onLegendItemRendering(args) {
args.fill= "#333"
}
provide("sankey", [SankeyTooltip, SankeyLegend, SankeyExport]);
</script>
<style>
#sankey-container {
height: 450px;
}
</style><template>
<div id="app" class="control-pane">
<div class="control-section" id="sankey-container">
<ejs-sankey
width="90%"
height="450px"
:legendSettings="legendSettings"
:legendItemRendering="onLegendItemRendering"
>
<e-sankey-nodes-collection>
<e-sankey-node id="Agricultural Waste" />
<e-sankey-node id="Biomass Residues" />
<e-sankey-node id="Bio-conversion" />
<e-sankey-node id="Liquid Biofuel" />
<e-sankey-node id="Electricity" />
<e-sankey-node id="Heat" />
</e-sankey-nodes-collection>
<e-sankey-links-collection>
<e-sankey-link sourceId="Agricultural Waste" targetId="Bio-conversion" :value="84.152" />
<e-sankey-link sourceId="Biomass Residues" targetId="Bio-conversion" :value="24.152" />
<e-sankey-link sourceId="Bio-conversion" targetId="Liquid Biofuel" :value="10.597" />
<e-sankey-link sourceId="Bio-conversion" targetId="Electricity" :value="36.862" />
<e-sankey-link sourceId="Bio-conversion" targetId="Heat" :value="60.845" />
</e-sankey-links-collection>
</ejs-sankey>
</div>
</div>
</template>
<script>
import {
SankeyComponent,
SankeyNodesCollectionDirective,
SankeyNodeDirective,
SankeyLinksCollectionDirective,
SankeyLinkDirective,
SankeyTooltip,
SankeyLegend,
SankeyExport
} from "@syncfusion/ej2-vue-charts";
export default {
name: "App",
components: {
"ejs-sankey": SankeyComponent,
"e-sankey-nodes-collection": SankeyNodesCollectionDirective,
"e-sankey-node": SankeyNodeDirective,
"e-sankey-links-collection": SankeyLinksCollectionDirective,
"e-sankey-link": SankeyLinkDirective
},
data() {
return {
legendSettings: {
visible: true,
position: "Bottom"
}
};
},
methods: {
onLegendItemRendering(args) {
args.fill = "#333"
}
},
provide: {
sankey: [SankeyTooltip, SankeyLegend, SankeyExport]
}
};
</script>
<style>
#sankey-container {
height: 450px;
}
</style>