Waterfall Chart in React Chart
17 Aug 202624 minutes to read
Waterfall Chart
Follow these steps to render a waterfall series, which visualizes the cumulative effect of sequentially introduced positive and negative values. Each bar connects to the next, making intermediate and running totals easy to follow.
-
Set the series type: Set the series
typetoWaterfallin the series configuration. -
Inject the WaterfallSeries module: Add
WaterfallSeriesto theservicesarray of theInjectcomponent insideChartComponent. This registers the functionality required to render a waterfall series. -
Configure intermediate and cumulative sums: Use the
intermediateSumIndexesproperty to mark intermediate sum values, and thesumIndexesproperty to mark cumulative sum values. Both accept an array of zero-basedxindices.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 };
const primaryyAxis = { minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} primaryYAxis={primaryyAxis} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9} negativeFillColor='#e56590'>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, Selection}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 };
const primaryyAxis: AxisModel = { minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
primaryYAxis={primaryyAxis}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}
negativeFillColor='#e56590'>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Binding data with series
You can bind data to the chart using the dataSource property within the series configuration. This allows you to connect a JSON dataset or remote data to your chart. To display the data correctly, map the fields from the data to the chart series xName and yName properties.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 };
const primaryyAxis = { minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} primaryYAxis={primaryyAxis} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9} negativeFillColor='#e56590'>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, Selection}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 };
const primaryyAxis: AxisModel = { minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
primaryYAxis={primaryyAxis}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}
negativeFillColor='#e56590'>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Series customization
Customize the waterfall series appearance with the following properties. Defaults are taken from the standard Series model.
| Property | Type | Default | Description |
|---|---|---|---|
fill |
string | null |
Color applied to positive (increase) and intermediate segments. |
negativeFillColor |
string | "#C64E4A" |
Color for negative (decrease) segments. |
summaryFillColor |
string | "4E81BC" |
Color for cumulative summary segments. |
intermediateSumIndexes |
number[] |
[] |
Indices into the x data at which intermediate sums are computed and visualized. |
sumIndexes |
number[] |
[] |
Indices into the x data at which final cumulative sums are computed and visualized. |
The negativeFillColor property specifies the color for negative (decrease) segments, helping visually distinguish reductions in the data. The summaryFillColor property specifies the color for cumulative summary segments.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { crossesAt: 15 };
const primaryyAxis = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
return <ChartComponent id='charts' primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }} primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9} summaryFillColor='#e56590' negativeFillColor='#f8b883'>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, Selection}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { crossesAt: 15 };
const primaryyAxis: AxisModel = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
return <ChartComponent id='charts'
primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }}
primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}
summaryFillColor='#e56590' negativeFillColor='#f8b883'>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Empty points
Data points with null or undefined values are considered empty. By default (mode: 'Gap'), empty points leave a gap in the series; the mode property on emptyPointSettings lets you change how they are handled.
Mode
Use the mode property to control handling of empty points. Available modes: Gap, Drop, Zero, Average. The default mode is Gap.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { crossesAt: 15 };
const primaryyAxis = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
const emptyPoint = { mode: 'Average' };
return <ChartComponent id='charts' primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }} primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' emptyPointSettings={emptyPoint} intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, Selection}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { crossesAt: 15 };
const primaryyAxis: AxisModel = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
const emptyPoint: object = { mode: 'Average' };
return <ChartComponent id='charts'
primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }}
primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' emptyPointSettings={emptyPoint} name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: null },
{ x: 'Balance' },
{ x: 'Administrative', y: -780 },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: null },
{ x: 'Balance' },
{ x: 'Administrative', y: -780 },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Fill
Use the fill property to set the fill color for empty points.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { crossesAt: 15 };
const primaryyAxis = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
const emptyPoint = { mode: 'Average', fill: 'red' };
return <ChartComponent id='charts' primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }} primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' emptyPointSettings={emptyPoint} intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, Selection}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { crossesAt: 15 };
const primaryyAxis: AxisModel = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
const emptyPoint: object = { mode: 'Average', fill: 'red' };
return <ChartComponent id='charts'
primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }}
primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' emptyPointSettings={emptyPoint} name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: null },
{ x: 'Balance' },
{ x: 'Administrative', y: -780 },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: null },
{ x: 'Balance' },
{ x: 'Administrative', y: -780 },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Border
Use the border property to customize the border width and color for empty points.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { crossesAt: 15 };
const primaryyAxis = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
const emptyPoint = { mode: 'Average', fill: 'red', border: {width: 1.5, color: 'green'} };
return <ChartComponent id='charts' primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }} primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' emptyPointSettings={emptyPoint} intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, Selection}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { crossesAt: 15 };
const primaryyAxis: AxisModel = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
const emptyPoint: object = { mode: 'Average', fill: 'red', border: {width: 1.5, color: 'green'} };
return <ChartComponent id='charts'
primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }}
primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' emptyPointSettings={emptyPoint} name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: null },
{ x: 'Balance' },
{ x: 'Administrative', y: -780 },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: null },
{ x: 'Balance' },
{ x: 'Administrative', y: -780 },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Events
Series render
The seriesRender event fires before each series is rendered and lets you modify series properties such as data, fill, or name. For a waterfall series, use it to vary per-series fill colors or to dynamically swap data sources between renders.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { crossesAt: 15 };
const primaryyAxis = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
const seriesRender = (args) => {
args.fill = '#ff6347';
args.series.negativeFillColor = '#ff6347';
args.series.summaryFillColor = '#ff6347';
};
return <ChartComponent id='charts' seriesRender={seriesRender} primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }} primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, ISeriesRenderEventArgs}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { crossesAt: 15 };
const primaryyAxis: AxisModel = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
const seriesRender = (args: ISeriesRenderEventArgs) => {
args.fill = '#ff6347';
args.series.negativeFillColor = '#ff6347';
args.series.summaryFillColor = '#ff6347';
};
return <ChartComponent id='charts'
primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }}
primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'
seriesRender={seriesRender}>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];Point render
The pointRender event fires before each data point is drawn, letting you customize per-point marker shape, border, or fill. For a waterfall series, use it to apply conditional coloring based on whether a segment is positive, negative, intermediate, or summary.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries } from '@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis = { crossesAt: 15 };
const primaryyAxis = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip = { enable: true, shared: false };
const legendSettings = { visible: false };
const pointRender = (args) => {
if (args.point.index % 2 !== 0) {
args.fill = '#ff6347';
}
else {
args.fill = '#009cb8';
}
};
return <ChartComponent id='charts' pointRender={pointRender} primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }} primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }} tooltip={tooltip} legendSettings={legendSettings} title='Company Revenue and Profit'>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]} sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,TooltipSettingsModel,LegendSettingsModel,
Legend, Category, Tooltip, DataLabel, Zoom, Crosshair, WaterfallSeries, IPointRenderEventArgs}
from'@syncfusion/ej2-react-charts';
import { data } from './datasource';
function App() {
const primaryxAxis: AxisModel = { crossesAt: 15 };
const primaryyAxis: AxisModel = { crossesAt: 5 };
const marker = { dataLabel: { visible: true, font: { color: '#ffffff' } } };
const connector = { color: '#5F6A6A', width: 2 };
const tooltip: TooltipSettingsModel = { enable: true, shared: false };
const legendSettings: LegendSettingsModel = { visible: false };
const pointRender = (args: IPointRenderEventArgs) => {
if (args.point.index % 2 !== 0) {
args.fill = '#ff6347';
}
else {
args.fill = '#009cb8';
}
};
return <ChartComponent id='charts'
primaryXAxis={{ valueType: 'Category', majorGridLines: { width: 0 }, plotOffset: 20 }}
primaryYAxis={{ minimum: 0, maximum: 5000, interval: 1000, majorGridLines: { width: 0 }, title: 'Expenditure' }}
tooltip={tooltip}
legendSettings={legendSettings}
title='Company Revenue and Profit'
pointRender={pointRender}>
<Inject services={[WaterfallSeries, Category, Tooltip, Zoom, Crosshair, Legend, DataLabel]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={data} xName='x' yName='y' name='USA' type='Waterfall' intermediateSumIndexes={[4]}
sumIndexes={[7]} marker={marker} connector={connector} columnWidth={0.9}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));export let data = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];export let data: Object[] = [
{ x: 'Income', y: 4711 },
{ x: 'Sales', y: -1015 },
{ x: 'Development', y: -688 },
{ x: 'Revenue', y: 1030 },
{ x: 'Balance' },
{ x: 'Expense', y: -361 },
{ x: 'Tax', y: -695 },
{ x: 'Net Profit' }
];