Ordered Data Copy Link
import { Component } from "@angular/core";
import { AgCharts } from "ag-charts-angular";
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,
]);
@Component({
selector: "my-app",
standalone: true,
imports: [AgCharts],
template: `<div class="example-controls">
<div class="controls-row">
<select (change)="setSeries($event.target.value)">
<option value="area">Area</option>
<option value="bar">Bar</option>
<option value="line" selected="">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 (change)="setAxes($event.target.value)">
<option value="time">Continuous Time</option>
<option value="ordinal-time">Ordinal Time</option>
<option value="ordinal-time-parent" selected="">Ordinal Time (Parent Level)</option>
<option value="unit-time">Unit Time</option>
</select>
<div class="button-group" role="group" aria-label="Data Size">
<input type="radio" id="data-size-1k" name="data-size" value="1000" (change)="setData($event)">
<label for="data-size-1k">1k</label>
<input type="radio" id="data-size-10k" name="data-size" value="10000" checked="" (change)="setData($event)">
<label for="data-size-10k">10k</label>
<input type="radio" id="data-size-100k" name="data-size" value="100000" (change)="setData($event)">
<label for="data-size-100k">100k</label>
<input type="radio" id="data-size-1m" name="data-size" value="1000000" (change)="setData($event)">
<label for="data-size-1m">1m</label>
</div>
</div>
</div>
<ag-charts
[options]="options"
></ag-charts>
`,
})
export class AppComponent {
public options;
constructor() {
this.options = {
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 },
},
},
};
}
setSeries = (type: string) => {
const options = clone(this.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;
}
options.series = [series];
this.options = options;
};
setAxes = (type: string) => {
const options = clone(this.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;
}
options.axes = { x: axis };
this.options = options;
};
setData = (event: Event) => {
const options = clone(this.options);
const points = Number((event.target as HTMLInputElement).value);
options.data = getData(points);
this.options = options;
};
}
Stacked Data Copy Link
import { Component } from "@angular/core";
import { AgCharts } from "ag-charts-angular";
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,
]);
@Component({
selector: "my-app",
standalone: true,
imports: [AgCharts],
template: `<div class="example-controls">
<div class="controls-row">
<select (change)="setSeries($event.target.value)">
<option value="area" selected="">Area</option>
<option value="bar">Bar</option>
<option value="line">Line</option>
</select>
<select (change)="setAxes($event.target.value)">
<option value="time">Continuous Time</option>
<option value="ordinal-time">Ordinal Time</option>
<option value="ordinal-time-parent" selected="">Ordinal Time (Parent Level)</option>
<option value="unit-time">Unit Time</option>
</select>
<button (click)="setData(1e3)">1k</button>
<button (click)="setData(1e4)">10k</button>
<button (click)="setData(1e5)">100k</button>
<button (click)="setData(1e6)">1m</button>
</div>
</div>
<ag-charts
[options]="options"
></ag-charts>
`,
})
export class AppComponent {
public options;
constructor() {
this.options = {
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 },
},
},
};
}
setSeries = (type: string) => {
const options = clone(this.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;
}
options.series = series;
this.options = options;
};
setAxes = (type: string) => {
const options = clone(this.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;
}
options.axes = { x: axis };
this.options = options;
};
setData = (points: number) => {
const options = clone(this.options);
options.data = getData(points);
this.options = options;
};
}
Bubble, Scatter Copy Link
import { Component } from "@angular/core";
import { AgCharts } from "ag-charts-angular";
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,
]);
@Component({
selector: "my-app",
standalone: true,
imports: [AgCharts],
template: `<div class="example-controls">
<div class="controls-row">
<select (change)="setSeries($event.target.value)">
<option value="bubble" selected="">Bubble</option>
<option value="scatter">Scatter</option>
</select>
<select (change)="setShape($event.target.value)">
<option value="circle" selected="">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 class="button-group" role="group" aria-label="Data Size">
<input type="radio" id="data-size-1k" name="data-size" value="1000" (change)="setData($event)">
<label for="data-size-1k">1k</label>
<input type="radio" id="data-size-10k" name="data-size" value="10000" checked="" (change)="setData($event)">
<label for="data-size-10k">10k</label>
<input type="radio" id="data-size-100k" name="data-size" value="100000" (change)="setData($event)">
<label for="data-size-100k">100k</label>
<input type="radio" id="data-size-1m" name="data-size" value="1000000" (change)="setData($event)">
<label for="data-size-1m">1m</label>
</div>
<label>
<span>Max Visible Items</span>
<input type="range" min="500" max="10000" step="500" value="2000" (change)="setMaxVisibleItems($event.target.valueAsNumber)">
</label>
</div>
</div>
<ag-charts
[options]="options"
></ag-charts>
`,
})
export class AppComponent {
public options;
constructor() {
this.options = {
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,
},
},
},
},
};
}
setSeries = (type: string) => {
const options = clone(this.options);
const { maxRenderedItems, shape } = options.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;
}
options.series = [series];
this.options = options;
};
setShape = (shape: string) => {
const options = clone(this.options);
let series = options.series?.[0] as any;
series.shape = shape;
options.series = [series];
this.options = options;
};
setMaxVisibleItems = (maxRenderedItems: number) => {
const options = clone(this.options);
let series = options.series?.[0] as any;
series.maxRenderedItems = maxRenderedItems;
options.series = [series];
this.options = options;
};
setData = (event: Event) => {
const options = clone(this.options);
const points = Number((event.target as HTMLInputElement).value);
options.data = getData(points);
this.options = options;
};
}