ChartJS: Membuat Grafik Responsive Auto Hide Label Jika Mobile
Membuat grafik responsive dan bisa auto hide label jika tampilan mobile dengan ChartJS dan PHP
Saat tampilan desktop, label x dan y nya lengkap ditampilkan semua, tapi saat diakses versi mobile, label x dan label y nya auto hide jadi tampilan grafiknya lebih full
Selain itu, bisa membuat dan menampilkan banyak chart dalam satu halaman
PHP
Contoh bagian PHP untuk get data dalam bentuk array
$grafik_label1 = array_column($penjualan, 'tanggal');
$grafik_data1 = array_column($penjualan, 'total');
// CodeIgniter atau Laravel
$data['grafik_label1'] = $grafik_label1;
$data['grafik_data1'] = $grafik_data1;
$grafik_label1
merupakan array tunggal berisi daftar tanggal, contoh['2024-05-01','2024-05-02','2024-05-03']
$grafik_data1
bertipe sama berisi daftar total penjualan, contoh['1250000','500000','1000000']
View
<div class="card">
<div class="card-body">
<h3 class="text-center">Grafik Penjualan</h3>
<canvas id="chart_penjualan"></canvas>
</div>
</div>
<!-- include ChartJS CDN -->
<script src="//cdn.jsdelivr.net/npm/chart.js"></script>
<script>
function isMobile() {
return window.innerWidth <= 768;
}
// fungsi untuk membuat chart
function createChart(chartId, chartTitle, labels, data, backgroundColor, borderColor) {
var ctx = document.getElementById(chartId).getContext('2d');
var commonOptions = {
responsive: true,
scales: {
y: {
beginAtZero: true,
// Label y tanpa nilai desimal
ticks: {
callback: function(value, index, values) {
if (Number.isInteger(value)) {
return value.toString();
}
}
},
// Label y nilai max ditambah jadi tidak mentok
suggestedMax: Math.max.apply(null, data) + 5
},
x: {
beginAtZero: true
}
}
};
// set option berdasarkan layar
function updateOptionsForScreenSize() {
if (isMobile()) {
commonOptions.scales.y.display = false;
commonOptions.scales.x.display = false;
} else {
commonOptions.scales.y.display = true;
commonOptions.scales.x.display = true;
}
}
updateOptionsForScreenSize();
var chart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: chartTitle,
data: data,
backgroundColor: backgroundColor,
borderColor: borderColor,
borderWidth: 1
}]
},
options: commonOptions
});
// event resize
window.addEventListener('resize', function() {
chart.destroy();
updateOptionsForScreenSize();
chart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: chartTitle,
data: data,
backgroundColor: backgroundColor,
borderColor: borderColor,
borderWidth: 1
}]
},
options: commonOptions
});
});
return chart;
}
// pembuatan chart
var chart1 = createChart(
'chart_penjualan',
'Total Penjualan',
<?= json_encode($grafik_label1) ?>,
<?= json_encode($grafik_data1) ?>,
'rgba(75, 192, 192, 0.8)',
'rgba(75, 192, 192, 1)'
);
// jika ada lebih dari satu chart bisa dibikin lagi, contoh
var chart2 = createChart(
'chart_keuntungan',
'Total Keuntungan',
<?= json_encode($grafik_label2) ?>,
<?= json_encode($grafik_data2) ?>,
'rgba(144, 238, 144, 0.8)',
'rgba(144, 238, 144, 1)'
);
</script>