$(() => {
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 content = $(`<svg><circle cx="100" cy="100" fill="#eee" r="${pieChart.getInnerRadius() - 6}"></circle>`
+ `<image x="70" y="58" width="60" height="40" href="../../../../images/flags/${country.replace(/\s/, '').toLowerCase()}.svg"/>`
+ '<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">${
formatNumber(total)
}</tspan></text></svg>`);
container.appendChild(content.get(0));
},
};
$('#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">
<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" />
<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/22.2.6/css/dx.light.css" />
<script src="https://cdn3.devexpress.com/jslib/22.2.6/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 },
];