Ordered Data Copy Link
import React, { useState, Fragment } from "react";
import { createRoot } from "react-dom/client";
import { AgCharts } from "ag-charts-react";
import {
AgCartesianAxisOptions,
AgCartesianChartOptions,
AgCartesianSeriesOptions,
AnimationModule,
AreaSeriesModule,
BarSeriesModule,
CandlestickSeriesModule,
ContextMenuModule,
CrosshairModule,
LegendModule,
LineSeriesModule,
ModuleRegistry,
NavigatorModule,
NumberAxisModule,
OhlcSeriesModule,
OrdinalTimeAxisModule,
RangeAreaSeriesModule,
RangeBarSeriesModule,
TimeAxisModule,
UnitTimeAxisModule,
ZoomModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
import clone from "clone";
ModuleRegistry.registerModules([
AnimationModule,
AreaSeriesModule,
BarSeriesModule,
CandlestickSeriesModule,
CrosshairModule,
LegendModule,
LineSeriesModule,
NavigatorModule,
NumberAxisModule,
OhlcSeriesModule,
OrdinalTimeAxisModule,
RangeAreaSeriesModule,
RangeBarSeriesModule,
TimeAxisModule,
UnitTimeAxisModule,
ZoomModule,
ContextMenuModule,
]);
const ChartExample = () => {
const [options, setOptions] = useState<AgCartesianChartOptions>({
data: getData(1e4),
animation: { enabled: false },
zoom: {
enabled: true,
anchorPointX: "pointer",
anchorPointY: "pointer",
autoScaling: {
enabled: true,
},
},
navigator: {
enabled: true,
miniChart: {
enabled: true,
},
},
series: [
{
type: "line",
xKey: "timestamp",
yKey: "close",
},
],
axes: {
x: {
type: "ordinal-time",
parentLevel: { enabled: true },
},
},
});
const setSeries = (type: string) => {
const nextOptions = clone(options);
let series: AgCartesianSeriesOptions;
switch (type) {
case "bar":
case "area":
case "line":
series = {
type,
xKey: "timestamp",
yKey: "close",
};
break;
case "range-area":
case "range-bar":
series = {
type,
xKey: "timestamp",
yLowKey: "low",
yHighKey: "high",
};
break;
case "candlestick":
case "ohlc":
series = {
type,
xKey: "timestamp",
lowKey: "low",
highKey: "high",
openKey: "open",
closeKey: "close",
};
break;
default:
return;
}
nextOptions.series = [series];
setOptions(nextOptions);
};
const setAxes = (type: string) => {
const nextOptions = clone(options);
let axis: AgCartesianAxisOptions;
switch (type) {
case "time":
axis = {
type,
nice: false,
};
break;
case "ordinal-time":
case "unit-time":
axis = {
type,
};
break;
case "ordinal-time-parent":
axis = {
type: "ordinal-time",
parentLevel: { enabled: true },
};
break;
default:
return;
}
nextOptions.axes = { x: axis };
setOptions(nextOptions);
};
const setData = (event: Event) => {
const nextOptions = clone(options);
const points = Number((event.target as HTMLInputElement).value);
nextOptions.data = getData(points);
setOptions(nextOptions);
};
return (
<Fragment>
<div className="example-controls">
<div className="controls-row">
<select onChange={(event) => setSeries(event.target.value)}>
<option value="area">Area</option>
<option value="bar">Bar</option>
<option value="line">Line</option>
<option value="range-area">Range Area</option>
<option value="range-bar">Range Bar</option>
<option value="candlestick">Candlestick</option>
<option value="ohlc">OHLC</option>
</select>
<select onChange={(event) => setAxes(event.target.value)}>
<option value="time">Continuous Time</option>
<option value="ordinal-time">Ordinal Time</option>
<option value="ordinal-time-parent">
Ordinal Time (Parent Level)
</option>
<option value="unit-time">Unit Time</option>
</select>
<div className="button-group" role="group" aria-label="Data Size">
<input
type="radio"
id="data-size-1k"
name="data-size"
defaultValue="1000"
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-1k">1k</label>
<input
type="radio"
id="data-size-10k"
name="data-size"
defaultValue="10000"
defaultChecked
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-10k">10k</label>
<input
type="radio"
id="data-size-100k"
name="data-size"
defaultValue="100000"
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-100k">100k</label>
<input
type="radio"
id="data-size-1m"
name="data-size"
defaultValue="1000000"
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-1m">1m</label>
</div>
</div>
</div>
<AgCharts options={options} />
</Fragment>
);
};
const root = createRoot(document.getElementById("root")!);
root.render(<ChartExample />);
Stacked Data Copy Link
import React, { useState, Fragment } from "react";
import { createRoot } from "react-dom/client";
import { AgCharts } from "ag-charts-react";
import {
AgCartesianAxisOptions,
AgCartesianChartOptions,
AgCartesianSeriesOptions,
AnimationModule,
AreaSeriesModule,
BarSeriesModule,
ContextMenuModule,
CrosshairModule,
LegendModule,
LineSeriesModule,
ModuleRegistry,
NavigatorModule,
NumberAxisModule,
OrdinalTimeAxisModule,
TimeAxisModule,
UnitTimeAxisModule,
ZoomModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
import clone from "clone";
ModuleRegistry.registerModules([
AnimationModule,
AreaSeriesModule,
BarSeriesModule,
CrosshairModule,
LegendModule,
LineSeriesModule,
NavigatorModule,
NumberAxisModule,
OrdinalTimeAxisModule,
TimeAxisModule,
UnitTimeAxisModule,
ZoomModule,
ContextMenuModule,
]);
const ChartExample = () => {
const [options, setOptions] = useState<AgCartesianChartOptions>({
data: getData(1e4),
animation: { enabled: false },
zoom: {
enabled: true,
anchorPointX: "pointer",
anchorPointY: "pointer",
autoScaling: {
enabled: true,
},
},
navigator: {
enabled: true,
miniChart: {
enabled: true,
},
},
series: [
{
type: "area",
xKey: "timestamp",
yKey: "petrol",
stacked: true,
},
{
type: "area",
xKey: "timestamp",
yKey: "diesel",
stacked: true,
},
],
axes: {
x: {
type: "ordinal-time",
parentLevel: { enabled: true },
},
},
});
const setSeries = (type: string) => {
const nextOptions = clone(options);
let series: AgCartesianSeriesOptions[];
switch (type) {
case "bar":
case "area":
case "line":
series = [
{
type,
xKey: "timestamp",
yKey: "petrol",
stacked: true,
},
{
type,
xKey: "timestamp",
yKey: "diesel",
stacked: true,
},
];
break;
default:
return;
}
nextOptions.series = series;
setOptions(nextOptions);
};
const setAxes = (type: string) => {
const nextOptions = clone(options);
let axis: AgCartesianAxisOptions;
switch (type) {
case "time":
axis = {
type,
nice: false,
};
break;
case "ordinal-time":
case "unit-time":
axis = {
type,
};
break;
case "ordinal-time-parent":
axis = {
type: "ordinal-time",
parentLevel: { enabled: true },
};
break;
default:
return;
}
nextOptions.axes = { x: axis };
setOptions(nextOptions);
};
const setData = (points: number) => {
const nextOptions = clone(options);
nextOptions.data = getData(points);
setOptions(nextOptions);
};
return (
<Fragment>
<div className="example-controls">
<div className="controls-row">
<select onChange={(event) => setSeries(event.target.value)}>
<option value="area">Area</option>
<option value="bar">Bar</option>
<option value="line">Line</option>
</select>
<select onChange={(event) => setAxes(event.target.value)}>
<option value="time">Continuous Time</option>
<option value="ordinal-time">Ordinal Time</option>
<option value="ordinal-time-parent">
Ordinal Time (Parent Level)
</option>
<option value="unit-time">Unit Time</option>
</select>
<button onClick={() => setData(1e3)}>1k</button>
<button onClick={() => setData(1e4)}>10k</button>
<button onClick={() => setData(1e5)}>100k</button>
<button onClick={() => setData(1e6)}>1m</button>
</div>
</div>
<AgCharts options={options} />
</Fragment>
);
};
const root = createRoot(document.getElementById("root")!);
root.render(<ChartExample />);
Bubble, Scatter Copy Link
import React, { useState, Fragment } from "react";
import { createRoot } from "react-dom/client";
import { AgCharts } from "ag-charts-react";
import {
AgCartesianChartOptions,
AgCartesianSeriesOptions,
AnimationModule,
BubbleSeriesModule,
CategoryAxisModule,
ContextMenuModule,
CrosshairModule,
LegendModule,
ModuleRegistry,
NumberAxisModule,
ScatterSeriesModule,
ZoomModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
import clone from "clone";
ModuleRegistry.registerModules([
AnimationModule,
BubbleSeriesModule,
CategoryAxisModule,
CrosshairModule,
LegendModule,
NumberAxisModule,
ScatterSeriesModule,
ZoomModule,
ContextMenuModule,
]);
const ChartExample = () => {
const [options, setOptions] = useState<AgCartesianChartOptions>({
data: getData(1e4),
animation: { enabled: false },
zoom: {
enabled: true,
axes: "xy",
anchorPointX: "pointer",
anchorPointY: "pointer",
autoScaling: {
enabled: false,
},
},
series: [
{
type: "bubble",
xKey: "x",
yKey: "y",
sizeKey: "size",
maxRenderedItems: 2000,
},
],
theme: {
overrides: {
bubble: {
series: {
fillOpacity: 0.2,
strokeOpacity: 0.2,
},
},
scatter: {
series: {
fillOpacity: 0.2,
strokeOpacity: 0.2,
},
},
},
},
});
const setSeries = (type: string) => {
const nextOptions = clone(options);
const { maxRenderedItems, shape } = nextOptions.series?.[0] as any;
let series: AgCartesianSeriesOptions;
switch (type) {
case "bubble":
series = {
type: "bubble",
xKey: "x",
yKey: "y",
sizeKey: "size",
shape,
maxRenderedItems,
};
break;
case "scatter":
series = {
type: "scatter",
xKey: "x",
yKey: "y",
shape,
maxRenderedItems,
};
break;
default:
return;
}
nextOptions.series = [series];
setOptions(nextOptions);
};
const setShape = (shape: string) => {
const nextOptions = clone(options);
let series = nextOptions.series?.[0] as any;
series.shape = shape;
nextOptions.series = [series];
setOptions(nextOptions);
};
const setMaxVisibleItems = (maxRenderedItems: number) => {
const nextOptions = clone(options);
let series = nextOptions.series?.[0] as any;
series.maxRenderedItems = maxRenderedItems;
nextOptions.series = [series];
setOptions(nextOptions);
};
const setData = (event: Event) => {
const nextOptions = clone(options);
const points = Number((event.target as HTMLInputElement).value);
nextOptions.data = getData(points);
setOptions(nextOptions);
};
return (
<Fragment>
<div className="example-controls">
<div className="controls-row">
<select onChange={(event) => setSeries(event.target.value)}>
<option value="bubble">Bubble</option>
<option value="scatter">Scatter</option>
</select>
<select onChange={(event) => setShape(event.target.value)}>
<option value="circle">Circle</option>
<option value="cross">Cross</option>
<option value="diamond">Diamond</option>
<option value="heart">Heart</option>
<option value="plus">Plus</option>
<option value="square">Square</option>
<option value="star">Star</option>
<option value="triangle">Triangle</option>
</select>
<div className="button-group" role="group" aria-label="Data Size">
<input
type="radio"
id="data-size-1k"
name="data-size"
defaultValue="1000"
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-1k">1k</label>
<input
type="radio"
id="data-size-10k"
name="data-size"
defaultValue="10000"
defaultChecked
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-10k">10k</label>
<input
type="radio"
id="data-size-100k"
name="data-size"
defaultValue="100000"
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-100k">100k</label>
<input
type="radio"
id="data-size-1m"
name="data-size"
defaultValue="1000000"
onChange={(event) => setData(event)}
/>
<label htmlFor="data-size-1m">1m</label>
</div>
<label>
<span>Max Visible Items</span>
<input
type="range"
min="500"
max="10000"
step="500"
defaultValue="2000"
onChange={(event) =>
setMaxVisibleItems(event.target.valueAsNumber)
}
/>
</label>
</div>
</div>
<AgCharts options={options} />
</Fragment>
);
};
const root = createRoot(document.getElementById("root")!);
root.render(<ChartExample />);