Your search did not match any results.
Doughnut Charts

Custom Label in the Center

To customize the doughnut's center, declare the SVG markup in the centerTemplate. This template accepts the PieChart instance. Use this instance to call widget methods. For example, call the getInnerRaduis() method to get the radius of the doughnut hole.

UNdata
Copy to CodeSandBox
Apply
Reset
<div> <div class="long-title"><h3>Energy Production (GWh, 2016)</h3></div> <div class="pies-container"> <dx-pie-chart *ngFor="let country of countries" class="pie" sizeGroup="piesGroup" [dataSource]="service.getData(country)" [animation]="false" resolveLabelOverlapping="shift" type="doughnut" centerTemplate="centerTemplate" [innerRadius]="0.65"> <dxi-series argumentField="commodity" valueField="total"> <dxo-label backgroundColor="none" [visible]="true" format="fixedPoint" [customizeText]="customizeLabel" > <dxo-connector [visible]="true" ></dxo-connector> </dxo-label> </dxi-series> <dxo-legend [visible]="false"> </dxo-legend> <svg *dxTemplate="let pieChart of 'centerTemplate'"> <circle cx="100" cy="100" [attr.r]="pieChart.getInnerRadius()-6" fill="#eee"></circle> <image attr.href="{{getImagePath(country)}}" x="70" y="58" width="60" height="40" /> <text text-anchor="middle" style="font-size: 18px" x="100" y="120" fill="#494949"> <tspan x="100" >{{country}}</tspan> <tspan x="100" dy="20px" style="font-weight: 600">{{ calculateTotal(pieChart) }}</tspan> </text> </svg> </dx-pie-chart> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxPieChartModule } from 'devextreme-angular'; import { DataItem, Service } from './app.service'; import { DecimalPipe } from '@angular/common'; if(!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'], providers: [Service] }) export class AppComponent { service: Service; countries: Iterable<string>; pipe: any = new DecimalPipe("en-US"); constructor(service: Service) { this.service = service; this.countries = new Set(service.getData().map(item => item.country)); } customizeLabel(e) { return `${e.argumentText}\n${e.valueText}`; } calculateTotal(pieChart) { const totalValue = pieChart.getAllSeries()[0].getVisiblePoints().reduce((s, p) => s + p.originalValue, 0); return this.pipe.transform(totalValue, "1.0-0"); } getImagePath(country) { return `../../../../images/flags/${country.replace(/\s/, "").toLowerCase()}.svg`; } } @NgModule({ imports: [ BrowserModule, DxPieChartModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep .pies-container { margin: auto; width: 800px; } ::ng-deep .pies-container > .pie { width: 400px; margin-top: -50px; float: left; } ::ng-deep .long-title h3 { font-weight: 200; font-size: 28px; text-align: center; margin-bottom: 20px; }
import { Injectable } from '@angular/core'; export class DataItem { country: string; commodity: string; total: number; } const data:DataItem[] = [ { country: "France", commodity: "Nuclear", total: 403195 }, { country: "Germany", commodity: "Nuclear", total: 84634 }, { country: "France", commodity: "Thermal", total: 57471 }, { country: "Germany", commodity: "Thermal", total: 419591 }, { country: "France", commodity: "Wind", total: 21400 }, { country: "Germany", commodity: "Wind", total: 78598 }, { country: "France", commodity: "Solar", total: 8160 }, { country: "Germany", commodity: "Solar", total: 38098 }, { country: "France", commodity: "Tidal, Wave", total: 501 } ]; var cache = {} @Injectable() export class Service { getData(country?: string): DataItem[] { if (country) { return cache[country] = cache[country] || data.filter(item => item.country === country); } return data; } }
// 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/ System.config({ transpiler: 'ts', typescriptOptions: { module: "commonjs", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.4.5/lib/typescript.js', '@angular/core': 'npm:@angular/core@8.0.0/bundles/core.umd.js', '@angular/common': 'npm:@angular/common@8.0.0/bundles/common.umd.js', '@angular/compiler': 'npm:@angular/compiler@8.0.0/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser@8.0.0/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@8.0.0/bundles/platform-browser-dynamic.umd.js', '@angular/router': 'npm:@angular/router@8.0.0/bundles/router.umd.js', '@angular/forms': 'npm:@angular/forms@8.0.0/bundles/forms.umd.js', '@angular/common/http': 'npm:@angular/common@8.0.0/bundles/common-http.umd.js', 'tslib': 'npm:tslib/tslib.js', 'rxjs': 'npm:rxjs@6.3.3', 'rxjs/operators': 'npm:rxjs@6.3.3/operators', 'devextreme': 'npm:devextreme@19.2', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devexpress-gantt': 'npm:devexpress-gantt', 'devextreme-angular': 'npm:devextreme-angular@19.2' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'rxjs': { main: 'index.js', defaultExtension: 'js' }, 'rxjs/operators': { main: 'index.js', defaultExtension: 'js' }, 'devextreme-angular': { main: 'index.js', defaultExtension: 'js' } } });
<!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/19.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.6.25/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/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>