DevExtreme v24.1 is now available.

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

Your search did not match any results.

JavaScript/jQuery 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 PieChart methods. For example, call the getInnerRaduis() method to get the radius of the doughnut hole.

Backend API
$(() => { const formatNumber = new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format; const commonSettings = { innerRadius: 0.65, resolveLabelOverlapping: 'shift', sizeGroup: 'piesGroup', legend: { visible: false, }, type: 'doughnut', series: [{ argumentField: 'commodity', valueField: 'total', label: { visible: true, connector: { visible: true, }, format: 'fixedPoint', backgroundColor: 'none', customizeText(e) { return `${e.argumentText}\n${e.valueText}`; }, }, }], centerTemplate(pieChart, container) { const total = pieChart .getAllSeries()[0] .getVisiblePoints() .reduce((s, p) => s + p.originalValue, 0); const { country } = pieChart.getAllSeries()[0].getVisiblePoints()[0].data; const circle = createElement('circle', { cx: 100, cy: 100, fill: '#eee', r: pieChart.getInnerRadius() - 6, }); const image = createElement('image', { x: 70, y: 58, width: 60, height: 40, href: `../../../../images/flags/${country.replace(/\s/, '').toLowerCase()}.svg`, }); const text = createText({ x: 100, y: 120, fill: '#494949', 'text-anchor': 'middle', 'font-size': 18, }, [country, formatNumber(total)]); container.appendChild(circle); container.appendChild(image); container.appendChild(text); }, }; function createElement(type, attributes) { const element = document.createElementNS('http://www.w3.org/2000/svg', type); Object.keys(attributes).forEach((attributeName) => { element.setAttribute(attributeName, attributes[attributeName]); }); return element; } function createText(attributes, contents) { const text = createElement('text', attributes); const tspan1 = createElement('tspan', { x: attributes.x, dy: 0 }); tspan1.textContent = contents[0]; const tspan2 = createElement('tspan', { x: attributes.x, dy: 20, 'font-weight': 600 }); tspan2.textContent = contents[1]; text.appendChild(tspan1); text.appendChild(tspan2); return text; } $('#countries') .dxPieChart($.extend({}, commonSettings, { dataSource: { store: data, filter: ['country', '=', 'France'], }, })); $('#waterLandRatio') .dxPieChart($.extend({}, commonSettings, { dataSource: { store: data, filter: ['country', '=', 'Germany'], }, })); });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <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=5.0" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script>window.jQuery || document.write(decodeURIComponent('%3Cscript src="js/jquery.min.js"%3E%3C/script%3E'))</script> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.7/css/dx.light.css" /> <script src="js/dx.all.js"></script> <script src="data.js"></script> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="index.js"></script> </head> <body class="dx-viewport"> <div class="demo-container"> <div class="long-title"><h3>Energy Production (GWh, 2016)</h3></div> <div class="pies-container"> <div id="countries"></div> <div id="waterLandRatio"></div> </div> </div> </body> </html>
.pies-container { margin: auto; width: 800px; } .pies-container > div { width: 400px; float: left; margin-top: -50px; } .long-title h3 { font-weight: 200; font-size: 28px; text-align: center; margin-bottom: 20px; }
const data = [ { country: 'France', commodity: 'Nuclear', total: 413278 }, { country: 'Germany', commodity: 'Nuclear', total: 76536 }, { country: 'France', commodity: 'Thermal', total: 47594 }, { country: 'Germany', commodity: 'Thermal', total: 375809 }, { country: 'France', commodity: 'Wind', total: 21033 }, { country: 'Germany', commodity: 'Wind', total: 58228 }, { country: 'France', commodity: 'Solar', total: 7274 }, { country: 'Germany', commodity: 'Solar', total: 37520 }, { country: 'France', commodity: 'Tidal, Wave', total: 618 }, ];