function number_format(number, decimals, dec_point, thousands_sep) { // * example: number_format(1234.56, 2, ',', ' '); // * return: '1 234,56' number = (number + '').replace(',', '').replace(' ', ''); var n = !isFinite(+number) ? 0 : +number, prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, dec = (typeof dec_point === 'undefined') ? '.' : dec_point, s = '', toFixedFix = function(n, prec) { var k = Math.pow(10, prec); return '' + Math.round(n * k) / k; }; // Fix for IE parseFloat(0.55).toFixed(0) = 0; s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); if (s[0].length > 3) { s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); } if ((s[1] || '').length < prec) { s[1] = s[1] || ''; s[1] += new Array(prec - s[1].length + 1).join('0'); } return s.join(dec); } $(document).ready(function () { const config = { type: 'line', data: { labels: [], datasets: [{ label: "BPM", lineTension: 0.3, backgroundColor: "rgb(255, 99, 132)", borderColor: "rgb(255, 99, 132)", pointRadius: 3, pointBackgroundColor: "rgb(255, 99, 132)", pointBorderColor: "rgb(255, 99, 132)", pointHoverRadius: 3, pointHoverBackgroundColor: "rgb(255, 99, 132)", pointHoverBorderColor: "rgb(255, 99, 132)", pointHitRadius: 10, pointBorderWidth: 2, data: [], fill: false, },{ label: "OXY", lineTension: 0.3, backgroundColor: "rgb(135, 206, 235)", borderColor: "rgb(135, 206, 235)", pointRadius: 3, pointBackgroundColor: "rgb(135, 206, 235)", pointBorderColor: "rgb(135, 206, 235)", pointHoverRadius: 3, pointHoverBackgroundColor: "rgb(135, 206, 235)", pointHoverBorderColor: "rgb(135, 206, 235)", pointHitRadius: 10, pointBorderWidth: 2, data: [], fill: false, }], }, options: { maintainAspectRatio: false, layout: { padding: { left: 10, right: 25, top: 25, bottom: 0 } }, scales: { xAxes: [{ time: { unit: 'date' }, gridLines: { display: false, drawBorder: false }, ticks: { maxTicksLimit: 7 } }], yAxes: [{ ticks: { maxTicksLimit: 5, padding: 10, // Include a dollar sign in the ticks callback: function(value, index, values) { return number_format(value); } }, gridLines: { color: "rgb(234, 236, 244)", zeroLineColor: "rgb(234, 236, 244)", drawBorder: false, borderDash: [2], zeroLineBorderDash: [2] } }], }, tooltips: { backgroundColor: "rgb(255,255,255)", bodyFontColor: "#858796", titleMarginBottom: 10, titleFontColor: '#6e707e', titleFontSize: 14, borderColor: '#858796', borderWidth: 1, xPadding: 15, yPadding: 15, displayColors: false, intersect: false, mode: 'index', caretPadding: 10, callbacks: { label: function(tooltipItem, chart) { var datasetLabel = chart.datasets[tooltipItem.datasetIndex].label || ''; return datasetLabel + ': ' + number_format(tooltipItem.yLabel); } } } } }; const context = document.getElementById('canvas').getContext('2d'); const lineChart = new Chart(context, config); const source = new EventSource("/chart-data"); source.onmessage = function (event) { const data = JSON.parse(event.data); if (config.data.labels.length === 40) { config.data.labels.shift(); config.data.datasets[0].data.shift(); config.data.datasets[1].data.shift(); } config.data.labels.push(data.time); config.data.datasets[0].data.push(data.value_bpm); config.data.datasets[1].data.push(data.value_oxy); lineChart.update(); } });