$(() => {
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">
<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/23.1.5/css/dx.light.css" />
<script src="https://cdn3.devexpress.com/jslib/23.1.5/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 },
];