Customize scatter chart in Angular Chart component
27 Apr 202417 minutes to read
By using the shape
property in the marker, you can customize the shape of the scatter series points like Circle, Rectangle, Triangle, Diamond, Cross, HorizontalLine, VerticalLine, Pentagon, InvertedTriangle and Image
.
You can customize the width and height of the shapes by using width
and height
properties of the marker.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { ChartModule, ChartAllModule, AccumulationChartAllModule } from '@syncfusion/ej2-angular-charts'
import { GridModule } from '@syncfusion/ej2-angular-grids'
import { PageService } from '@syncfusion/ej2-angular-grids'
import { AccumulationChartModule } from '@syncfusion/ej2-angular-charts'
import { DialogModule } from '@syncfusion/ej2-angular-popups'
import { PieSeriesService, AccumulationTooltipService, AccumulationDataLabelService } from '@syncfusion/ej2-angular-charts'
import {
LineSeriesService, DateTimeService, DataLabelService, StackingColumnSeriesService, CategoryService,
StepAreaSeriesService, SplineSeriesService, ScrollBarService, ChartAnnotationService, LegendService, TooltipService, StripLineService,
SelectionService, ScatterSeriesService, ZoomService, ColumnSeriesService, AreaSeriesService, RangeAreaSeriesService
} from '@syncfusion/ej2-angular-charts'
import { Component, OnInit } from '@angular/core';
@Component({
imports: [
ChartModule, ChartAllModule, AccumulationChartAllModule, AccumulationChartModule, GridModule, DialogModule
],
providers: [LineSeriesService, DateTimeService, ColumnSeriesService, DataLabelService, ZoomService, StackingColumnSeriesService, CategoryService,
StepAreaSeriesService, SplineSeriesService, ChartAnnotationService, LegendService, TooltipService, StripLineService,
PieSeriesService, AccumulationTooltipService, ScrollBarService, AccumulationDataLabelService, SelectionService, ScatterSeriesService,
PageService, AreaSeriesService, RangeAreaSeriesService ],
standalone: true,
selector: 'app-container',
template: `
<ejs-chart style='display:block;' [chartArea]='chartArea' align='center' id='chartcontainer' [title]='title'
[primaryXAxis]='primaryXAxis' [primaryYAxis]='primaryYAxis'>
<e-series-collection>
<e-series [dataSource]='series1' type='Scatter' xName='x' yName='y' opacity='0.6' name='Male' width=2 [marker]='marker1'>
</e-series>
<e-series [dataSource]='series2' type='Scatter' xName='x' yName='y' opacity='0.6' name='Female' width=2 [marker]='marker2'>
</e-series>
</e-series-collection>
</ejs-chart>
`
})
export class AppComponent {
public chartArea: Object = {
border: {
width: 0
}
};
//Initializing Primary X Axis
public primaryXAxis: Object = {
minimum: 100,
maximum: 220,
majorGridLines: { width: 0 },
edgeLabelPlacement: 'Shift',
title: 'Height in Inches'
};
//Initializing Primary Y Axis
public primaryYAxis: Object = {
majorTickLines: {
width: 0
},
lineStyle: {
width: 0
},
minimum: 0,
maximum: 100,
interval: 10,
title: 'Weight in Pounds',
rangePadding: 'None'
};
public marker1: Object = {
visible: false,
width: 28,
height: 20,
shape: 'Rectangle',
dataLabel: {visible: true, position: 'Inner' }
};
public marker2: Object = {
visible: false,
width: 12,
height: 12,
shape: 'Diamond'
};
public title: string = 'Height vs Weight';
public series1: Object[] = [
{ 'x': 131, 'y': 32, text: '131%' }, { 'x': 140, 'y': 52, text: '140%' }, { 'x': 149, 'y': 82, text: '149%' }, { 'x': 115, 'y': 52, text: '115%' },
{ 'x': 134, 'y': 62, text: '134%' }, { 'x': 183, 'y': 12, text: '183%' }, { 'x': 155, 'y': 32, text: '155%' }, { 'x': 164, 'y': 22, text: '164%' }];
public series2: Object[] = [
{ 'x': 115, 'y': 67, text: '115%' },
{ 'x': 138, 'y': 87, text: '138%' },
{ 'x': 166, 'y': 37, text: '166%' },
{ 'x': 122, 'y': 27, text: '122%' },
{ 'x': 126, 'y': 47, text: '126%' },
{ 'x': 119, 'y': 18, text: '119%' },
{ 'x': 141, 'y': 88, text: '141%' },
{ 'x': 180, 'y': 78, text: '180%' }
];
constructor() {
//code
};
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Customizing point color and data label value
You can customize the point color by using pointRender
event in the chart. In which we have check the condition based on yValue
to change the fill color of the point.
By default datalabel values shows y values of the datasource. You can customize the datalabel value by using textRender
event in the chart.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { ChartModule, ChartAllModule, AccumulationChartAllModule } from '@syncfusion/ej2-angular-charts'
import { GridModule } from '@syncfusion/ej2-angular-grids'
import { PageService } from '@syncfusion/ej2-angular-grids'
import { AccumulationChartModule } from '@syncfusion/ej2-angular-charts'
import { DialogModule } from '@syncfusion/ej2-angular-popups'
import { PieSeriesService, AccumulationTooltipService, AccumulationDataLabelService } from '@syncfusion/ej2-angular-charts'
import {
LineSeriesService, DateTimeService, DataLabelService, StackingColumnSeriesService, CategoryService,
StepAreaSeriesService, SplineSeriesService, ScrollBarService, ChartAnnotationService, LegendService, TooltipService, StripLineService,
SelectionService, ScatterSeriesService, ZoomService, ColumnSeriesService, AreaSeriesService, RangeAreaSeriesService
} from '@syncfusion/ej2-angular-charts'
import { Component } from '@angular/core';
import { ITextRenderEventArgs, IPointRenderEventArgs } from '@syncfusion/ej2-angular-charts';
@Component({
imports: [
ChartModule, ChartAllModule, AccumulationChartAllModule, AccumulationChartModule, GridModule, DialogModule
],
providers: [LineSeriesService, DateTimeService, ColumnSeriesService, DataLabelService, ZoomService, StackingColumnSeriesService, CategoryService,
StepAreaSeriesService, SplineSeriesService, ChartAnnotationService, LegendService, TooltipService, StripLineService,
PieSeriesService, AccumulationTooltipService, ScrollBarService, AccumulationDataLabelService, SelectionService, ScatterSeriesService,
PageService, AreaSeriesService, RangeAreaSeriesService ],
standalone: true,
selector: 'app-container',
template: `
<ejs-chart style='display:block;' [chartArea]='chartArea' align='center' id='chartcontainer' [title]='title'
[primaryXAxis]='primaryXAxis' [primaryYAxis]='primaryYAxis' (textRender)='textRender($event)'
(pointRender)='pointRender($event)' [tooltip]='tooltip' >
<e-series-collection>
<e-series [dataSource]='series1' type='Scatter' xName='x' yName='y' opacity='0.6' name='Male' width=2 [marker]='marker1'>
</e-series>
<e-series [dataSource]='series2' type='Scatter' xName='x' yName='y' opacity='0.6' name='Female' width=2 [marker]='marker2'>
</e-series>
</e-series-collection>
</ejs-chart>
`
})
export class AppComponent {
public chartArea: Object = {
border: {
width: 0
}
};
//Initializing Primary X Axis
public primaryXAxis: Object = {
minimum: 100,
maximum: 220,
majorGridLines: { width: 0 },
edgeLabelPlacement: 'Shift',
title: 'Height in Inches'
};
//Initializing Primary Y Axis
public primaryYAxis: Object = {
majorTickLines: {
width: 0
},
lineStyle: {
width: 0
},
minimum: 0,
maximum: 100,
interval: 10,
title: 'Weight in Pounds',
rangePadding: 'None'
};
public marker1: Object = {
visible: false,
width: 28,
height: 20,
shape: 'Rectangle',
dataLabel: {visible: true, position: 'Inner', name: 'text'}
};
public marker2: Object = {
visible: false,
width: 12,
height: 12,
shape: 'Diamond'
};
public tooltip: Object = {
enable: true,
format: 'Weight: <b>${point.x} lbs</b> <br/> Height: <b>${point.y}"</b>'
};
public textRender(args: ITextRenderEventArgs): void {
args.text = args.point.x + '';
};
public pointRender(args: IPointRenderEventArgs | any): void {
if (args.point.y > 80) {
args.fill='red'
} else if(args.point.y < 40) {
args.fill='green'
}
};
public title: string = 'Height vs Weight';
public series1: Object[] = [
{ 'x': 131, 'y': 32, text: '131%' }, { 'x': 140, 'y': 52, text: '140%' }, { 'x': 149, 'y': 82, text: '149%' }, { 'x': 115, 'y': 52, text: '115%' },
{ 'x': 134, 'y': 62, text: '134%' }, { 'x': 183, 'y': 12, text: '183%' }, { 'x': 155, 'y': 32, text: '155%' }, { 'x': 164, 'y': 22, text: '164%' }];
public series2: Object[] = [
{ 'x': 115, 'y': 67, text: '115%' },
{ 'x': 138, 'y': 87, text: '138%' },
{ 'x': 166, 'y': 37, text: '166%' },
{ 'x': 122, 'y': 27, text: '122%' },
{ 'x': 126, 'y': 47, text: '126%' },
{ 'x': 119, 'y': 18, text: '119%' },
{ 'x': 141, 'y': 88, text: '141%' },
{ 'x': 180, 'y': 78, text: '180%' }
];
constructor() {
//code
};
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));