DevExtreme v23.2 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

Customize Points and Labels

This demo shows how you can customize individual points and labels in the Chart component.

Customize Points

Use the customizePoint function to change the appearance of individual series points. This function should return an object with properties that you want to change in a point configuration. This demo uses this function to color all points with values above the "High Average" in red, and points with values below the "Low Average" in blue.

Customize Labels

To customize the appearance of individual point labels, implement the customizeLabel function. This function should also return an object with properties that need to be changed for a certain label. This demo specifies custom labels for the red points.

Create Constant Lines

To create constant lines, follow the steps below:

  1. Choose a direction for the line. You can specify horizontal lines in the valueAxis object, and vertical - in the argumentAxis object.

  2. Specify the constantLines object. In this object, declare an object for each line with the properties you want to change.

Note that it's necessary to specify the value property for the line to display correctly.

Backend API
<dx-chart id="chart" [dataSource]="temperaturesData" title="Daily Temperature in May" [customizePoint]="customizePoint" [customizeLabel]="customizeLabel" > <dxi-series argumentField="day" valueField="value" type="bar" color="#e7d19a" ></dxi-series> <dxi-value-axis [maxValueMargin]="0.01" [visualRange]="{ startValue: 40 }"> <dxo-label [customizeText]="customizeText"></dxo-label> <dxi-constant-line [width]="2" [value]="lowAverage" color="#8c8cff" dashStyle="dash" > <dxo-label text="Low Average"></dxo-label> </dxi-constant-line> <dxi-constant-line [width]="2" [value]="highAverage" color="#ff7c7c" dashStyle="dash" > <dxo-label text="High Average"></dxo-label> </dxi-constant-line> </dxi-value-axis> <dxo-legend [visible]="false"></dxo-legend> <dxo-export [enabled]="true"></dxo-export> </dx-chart>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxChartModule, DxChartTypes } from 'devextreme-angular/ui/chart'; import { Service, Temperature } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', providers: [Service], templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'], }) export class AppComponent { highAverage = 77; lowAverage = 58; temperaturesData: Temperature[]; constructor(service: Service) { this.temperaturesData = service.getTemperaturesData(); } customizePoint: DxChartTypes.Properties['customizePoint'] = ({ value }) => { if (value > this.highAverage) { return { color: '#ff7c7c', hoverStyle: { color: '#ff7c7c' } }; } return (value < this.lowAverage) ? { color: '#8c8cff', hoverStyle: { color: '#8c8cff' } } : undefined; }; customizeLabel: DxChartTypes.Properties['customizeLabel'] = ({ value }) => { if (value > this.highAverage) { return { visible: true, backgroundColor: '#ff7c7c', customizeText: this.customizeText, }; } }; customizeText: DxChartTypes.ValueAxisLabel['customizeText'] = ({ valueText }) => `${valueText}&#176F`; } @NgModule({ imports: [ BrowserModule, BrowserTransferStateModule, DxChartModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep #chart { height: 440px; }
import { Injectable } from '@angular/core'; export class Temperature { day: string; value: number; } const temperaturesData : Temperature[] = [{ day: '1', value: 57, }, { day: '2', value: 58, }, { day: '3', value: 57, }, { day: '4', value: 59, }, { day: '5', value: 63, }, { day: '6', value: 63, }, { day: '7', value: 63, }, { day: '8', value: 64, }, { day: '9', value: 64, }, { day: '10', value: 64, }, { day: '11', value: 69, }, { day: '12', value: 72, }, { day: '13', value: 75, }, { day: '14', value: 78, }, { day: '15', value: 76, }, { day: '16', value: 70, }, { day: '17', value: 65, }, { day: '18', value: 65, }, { day: '19', value: 68, }, { day: '20', value: 70, }, { day: '21', value: 73, }, { day: '22', value: 73, }, { day: '23', value: 75, }, { day: '24', value: 78, }, { day: '25', value: 76, }, { day: '26', value: 76, }, { day: '27', value: 80, }, { day: '28', value: 76, }, { day: '29', value: 75, }, { day: '30', value: 75, }, { day: '31', value: 74, }]; @Injectable() export class Service { getTemperaturesData(): Temperature[] { return temperaturesData; } }
// In real applications, you should not transpile code in the browser. // You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, }, meta: { 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', '@angular/core': 'npm:@angular/core@12.2.17', '@angular/platform-browser': 'npm:@angular/platform-browser@12.2.17', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@12.2.17', '@angular/forms': 'npm:@angular/forms@12.2.17', '@angular/common': 'npm:@angular/common@12.2.17', '@angular/compiler': 'npm:@angular/compiler@12.2.17', 'tslib': 'npm:tslib@2.6.2/tslib.js', 'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js', 'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@23.2.5/cjs', 'devextreme/bundles/dx.all': 'npm:devextreme@23.2.5/bundles/dx.all.js', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.4/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.5', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.51', 'devextreme-angular': 'npm:devextreme-angular@23.2.5', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.12', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, 'rxjs': { defaultExtension: 'js', }, 'rxjs/operators': { defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.12/inferno/package.json', 'npm:@angular/*/package.json', 'npm:@angular/common@12.2.17/*/package.json', 'npm:rxjs@7.5.3/package.json', 'npm:rxjs@7.5.3/operators/package.json', 'npm:devextreme-angular@23.2.5/*/package.json', 'npm:devextreme-angular@23.2.5/ui/*/package.json', 'npm:devextreme-angular@23.2.5/package.json', 'npm:devexpress-diagram@2.2.5/package.json', 'npm:devexpress-gantt@4.1.51/package.json', ], }; System.config(window.config);
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.2.5/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.12.0/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.13/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import("app").catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>