DevExtreme v23.1 is now available.

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

Your search did not match any results.
Pie Charts

Pie with Custom Labels

This demo illustrates how to customize the PieChart component labels.

The series.label object allows you to specify the following settings:

  • visible
    Specifies the visibility of point labels.

  • position
    Specifies a label position relative to the PieChart.

    • outside
      The labels are outside the component.

    • columns
      The labels are outside the component and are arranged in columns. In this demo, you can see this mode in action.

    • inside
      The labels are inside the points.

  • customizeText
    A function that returns text displayed by point labels.

  • font
    Specifies font properties for label text. This demo uses the nested size property to change the font size.

  • connector
    Specifies connector properties for labels. In this demo, the nested visible property is enabled, and the connector width is set to 0.5.

You can also format label text and change word wrap mode, specify the background color and borders, and rotate and shift the labels.
Backend API
Copy to CodeSandBox
<template> <DxPieChart id="pie" :data-source="dataSource" palette="Bright" title="Olympic Medals in 2008" > <DxSeries argument-field="country" value-field="medals" > <DxLabel :visible="true" :customize-text="formatLabel" position="columns" > <DxConnector :visible="true" :width="0.5" /> <DxFont :size="16"/> </DxLabel> </DxSeries> <DxLegend :column-count="4" orientation="horizontal" item-text-position="right" horizontal-alignment="center" vertical-alignment="bottom" /> <DxExport :enabled="true"/> </DxPieChart> </template> <script> import DxPieChart, { DxSeries, DxLegend, DxLabel, DxConnector, DxFont, DxExport, } from 'devextreme-vue/pie-chart'; import { dataSource } from './data.js'; export default { components: { DxPieChart, DxSeries, DxLegend, DxLabel, DxConnector, DxFont, DxExport, }, data() { return { dataSource, }; }, methods: { formatLabel(pointInfo) { return `${pointInfo.valueText} (${pointInfo.percentText})`; }, }, }; </script> <style> #pie { height: 440px; } </style>
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!DOCTYPE html> <html> <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="" /> <script src=""></script> <script src=""></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.js"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>
export const dataSource = [{ country: 'USA', medals: 110, }, { country: 'China', medals: 100, }, { country: 'Russia', medals: 72, }, { country: 'Britain', medals: 47, }, { country: 'Australia', medals: 46, }, { country: 'Germany', medals: 41, }, { country: 'France', medals: 40, }, { country: 'South Korea', medals: 31, }];
window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, '*.ts': { loader: 'demo-ts-loader', }, '*.svg': { loader: 'svg-loader', }, 'devextreme/localization.js': { 'esModule': true, }, }, paths: { 'root:': '../../../../../', 'npm:': '', }, map: { 'vue': 'npm:vue@3.3.4/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js', 'demo-ts-loader': 'root:utils/demo-ts-loader.js', 'svg-loader': 'root:utils/svg-loader.js', 'mitt': 'npm:mitt/dist/mitt.umd.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.1.5/cjs', 'devextreme-vue': 'npm:devextreme-vue@23.1.5', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.2/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.1/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.48/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.11', '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', 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'devextreme-vue': { main: 'index.js', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.11/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);