Cara Menggambar Diagram Batang Menggunakan JavaScript dan Canvas HTML5
Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)



Dalam tutorial sebelumnya, kita membahas cara menggambar diagram lingkaran atau diagram donat menggunakan canvas HTML5. Dalam tutorial ini saya akan menunjukkan cara menggunakan JavaScript dan canvas HTML5 sebagai sarana untuk menampilkan data secara grafis dengan menggunakan diagram batang.
Ada cara yang lebih mudah untuk membuat diagram daripada mengkodekannya dari awal, misalnya pustaka diagram lengkap ini dari CodeCanyon.



Tapi jika Anda ingin tahu apa yang diperlukan untuk membuat pustaka seperti ini, tutorial ini untuk Anda.
Apa itu Diagram Batang?
Diagram batang adalah alat yang sangat umum digunakan untuk mewakili data numerik. Dari laporan keuangan hingga presentasi PowerPoint hingga infografis, diagram batang sangat sering digunakan karena mereka menawarkan tampilan data numerik yang sangat mudah dipahami.
Diagram batang mewakili data numerik dengan menggunakan batang, yang berbentuk persegi panjang dengan lebar atau tinggi proporsional dengan data numerik yang mereka wakili.
Ada banyak jenis diagram batang:
- diagram batang horisontal dan diagram batang vertikal tergantung pada orientasi diagram
- diagram batang yang ditumpuk atau diagram batang klasik untuk mewakili beberapa rangkaian data
- diagram batang 2D atau 3D
- dll.
Apa Saja Komponen dari Diagram Batang?
Mari kita lihat komponen yang membentuk diagram batang terlepas dari jenisnya:



- Data diagram: ini adalah kumpulan angka dan kategori terkait yang ditunjukkan oleh diagram.
- Nama rangkaian data (1).
- Grid diagram (2): memberikan sistem referensi sehingga representasi visual dapat dengan mudah dipahami.
- Batang (3): persegi panjang penuh warna dengan dimensi sebanding dengan data yang diwakili.
- Legenda diagram (4): menunjukkan korespondensi antara warna yang digunakan dan data yang mereka wakili.
Sekarang kita tahu komponen diagram batang, mari kita lihat bagaimana kita bisa menulis kode JavaScript untuk menggambar diagram seperti ini.
Menggambar Diagram Batang Menggunakan JavaScript
Menyiapkan Proyek JS
Untuk mulai menggambar menggunakan JavaScript dan canvas HTML5, kita perlu menyiapkan proyek kita seperti ini:
- Buatlah folder untuk menampung file proyek; mari kita sebut folder ini
bar-chart-tutorial
. - Di dalam folder proyek, buat file dan sebutlah
index.html
. Ini akan berisi kode HTML kita. - Juga di dalam folder proyek, buat file dan sebutlah
script.js
. Ini akan berisi kode JavaScript untuk menggambar diagram batang.
Kita akan menjaga hal-hal sangat sederhana dan menambahkan kode berikut di dalam index.html
:
1 |
<html>
|
2 |
<body>
|
3 |
<canvas id="myCanvas"></canvas> |
4 |
<script type="text/javascript" src="script.js"></script> |
5 |
</body>
|
6 |
</html>
|
Kita memiliki elemen <canvas>
dengan ID myCanvas
sehingga kita bisa mereferensikannya dalam kode JS kita. Kita kemudian memuat kode JS melalui tag <script>
.
Tambahkan kode berikut di file script.js
:
1 |
var myCanvas = document.getElementById("myCanvas"); |
2 |
myCanvas.width = 300; |
3 |
myCanvas.height = 300; |
4 |
|
5 |
var ctx = myCanvas.getContext("2d"); |
Ini mendapatkan referensi ke elemen canvas dan kemudian menetapkan lebar dan tinggi menjadi 300px
. Untuk menggambar di canvas, kita hanya memerlukan referensi ke konteks 2D, yang berisi semua metode gambar.
Menambahkan Beberapa Fungsi Pembantu
Menggambar diagram batang hanya perlu mengetahui cara menggambar dua elemen:
- menggambar garis: untuk menggambar garis grid
- menggambar persegi panjang berisi warna: untuk menggambar batang dari diagram
Mari membuat fungsi JS pembantu untuk kedua elemen ini. Kita akan menambahkan fungsi di file script.js
kita.
1 |
function drawLine(ctx, startX, startY, endX, endY,color){ |
2 |
ctx.save(); |
3 |
ctx.strokeStyle = color; |
4 |
ctx.beginPath(); |
5 |
ctx.moveTo(startX,startY); |
6 |
ctx.lineTo(endX,endY); |
7 |
ctx.stroke(); |
8 |
ctx.restore(); |
9 |
}
|
Fungsi drawLine
mengambil enam parameter:
-
ctx
: mengacu pada konteks gambar -
startX
: koordinat X dari titik awal garis -
startY
: koordinat Y dari titik awal garis
-
endX
: koordinat X dari titik akhir garis
-
endY
: koordinat Y dari titik akhir garis
-
color
: warna dari garis
Kita memodifikasi pengaturan warna untuk strokeStyle
. Ini menentukan warna yang digunakan untuk menggambar garis. Kita menggunakan ctx.save()
dan ctx.restore()
sehingga kita tidak mempengaruhi warna yang digunakan di luar fungsi ini.
Kita menggambar garis dengan memanggil beginPath()
. Ini menginformasikan konteks gambar bahwa kita mulai menggambar sesuatu yang baru di atas canvas. Kita menggunakan moveTo()
untuk mengatur titik awal, panggilan lineTo()
untuk menunjukkan titik akhir, dan kemudian benar-benar menggambar dengan memanggil stroke()
.
Fungsi pembantu lain yang kita butuhkan adalah fungsi untuk menggambar sebuah batang—yang merupakan persegi panjang berisi warna. Mari menambahkannya ke script.js
:
1 |
function drawBar(ctx, upperLeftCornerX, upperLeftCornerY, width, height,color){ |
2 |
ctx.save(); |
3 |
ctx.fillStyle=color; |
4 |
ctx.fillRect(upperLeftCornerX,upperLeftCornerY,width,height); |
5 |
ctx.restore(); |
6 |
} |
Fungsi drawBar
membutuhkan enam parameter:
-
ctx
: mengacu pada konteks gambar -
upperLeftCornerX
: koordinat X dari pojok kiri atas batang -
upperLeftCornerY
: koordinat Y dari pojok kiri atas batang -
width
: lebar batang
-
height
: tinggi batang -
color
: warna dari batang
Model Data Diagram Batang
Sekarang setelah fungsi pembantu kita di tempatnya, mari beralih ke model data diagram. Semua jenis grafik, termasuk diagram batang, memiliki model data di belakangnya. Model data adalah kumpulan data numerik yang terstruktur. Untuk tutorial ini kita akan menggunakan serangkaian data kategori dan nilai numerik yang terkait yang mewakili jumlah rekaman vinyl dalam kumpulan rekaman saya yang dikelompokkan berdasarkan genre musik:
- Classical music: 10
- Alternative rock: 14
- Pop: 2
- Jazz: 12
Kita bisa mewakili ini dalam JavaScript dalam bentuk objek. Mari menambahkannya ke file script.js
kita:
1 |
var myVinyls = { |
2 |
"Classical music": 10, |
3 |
"Alternative rock": 14, |
4 |
"Pop": 2, |
5 |
"Jazz": 12 |
6 |
};
|
Menerapkan Komponen Diagram Batang
Mari kita menerapkan komponen yang akan melakukan penggambaran grafik batang kita yang sebenarnya. Kita akan melakukan ini dengan menambahkan objek JavaScript berikut ke file script.js
kita:
1 |
var Barchart = function(options){ |
2 |
this.options = options; |
3 |
this.canvas = options.canvas; |
4 |
this.ctx = this.canvas.getContext("2d"); |
5 |
this.colors = options.colors; |
6 |
|
7 |
this.draw = function(){ |
8 |
var maxValue = 0; |
9 |
for (var categ in this.options.data){ |
10 |
maxValue = Math.max(maxValue,this.options.data[categ]); |
11 |
}
|
12 |
var canvasActualHeight = this.canvas.height - this.options.padding * 2; |
13 |
var canvasActualWidth = this.canvas.width - this.options.padding * 2; |
14 |
|
15 |
//drawing the grid lines
|
16 |
var gridValue = 0; |
17 |
while (gridValue <= maxValue){ |
18 |
var gridY = canvasActualHeight * (1 - gridValue/maxValue) + this.options.padding; |
19 |
drawLine( |
20 |
this.ctx, |
21 |
0, |
22 |
gridY, |
23 |
this.canvas.width, |
24 |
gridY, |
25 |
this.options.gridColor |
26 |
);
|
27 |
|
28 |
//writing grid markers
|
29 |
this.ctx.save(); |
30 |
this.ctx.fillStyle = this.options.gridColor; |
31 |
this.ctx.font = "bold 10px Arial"; |
32 |
this.ctx.fillText(gridValue, 10,gridY - 2); |
33 |
this.ctx.restore(); |
34 |
|
35 |
gridValue+=this.options.gridScale; |
36 |
}
|
37 |
|
38 |
//drawing the bars
|
39 |
var barIndex = 0; |
40 |
var numberOfBars = Object.keys(this.options.data).length; |
41 |
var barSize = (canvasActualWidth)/numberOfBars; |
42 |
|
43 |
for (categ in this.options.data){ |
44 |
var val = this.options.data[categ]; |
45 |
var barHeight = Math.round( canvasActualHeight * val/maxValue) ; |
46 |
drawBar( |
47 |
this.ctx, |
48 |
this.options.padding + barIndex * barSize, |
49 |
this.canvas.height - barHeight - this.options.padding, |
50 |
barSize, |
51 |
barHeight, |
52 |
this.colors[barIndex%this.colors.length] |
53 |
);
|
54 |
|
55 |
barIndex++; |
56 |
}
|
57 |
|
58 |
}
|
59 |
}
|
Kelas dimulai dengan menyimpan options
yang diberikan sebagai parameter. Ini menyimpan referensi canvas
dan menciptakan konteks gambar juga disimpan sebagai anggota kelas. Kemudian ia menyimpan array colors
yang disampaikan sebagai opsi.
Bagian selanjutnya adalah yang paling konsisten, fungsi draw()
. Ini akan menggambar diagram dengan terlebih dahulu menggambar garis grid, penanda grid dan kemudian batangnya yang menggunakan parameter yang dikirimkan objek options
.
Melihat fungsi draw()
, kita dapat melihat bahwa pertama kita menghitung nilai maksimum untuk model data kita. Kita membutuhkan angka ini karena kita perlu mengukur semua jenis batang sesuai dengan nilai ini dan sesuai dengan ukuran kanvasnya. Jika tidak, batang kita mungkin berada di luar area tampilan, dan kita tidak menginginkannya.
Variabel canvasActualHeight
dan canvasActualWidth
menyimpan tinggi dan lebar canvas yang disesuaikan dengan nilai padding yang disampaikan melalui options
. Variabel padding
menunjukkan jumlah piksel antara tepi canvas dan diagram di dalamnya.
Kita kemudian menggambar garis grid dari diagram. Variabel options.gridScale
menetapkan langkah yang digunakan untuk menggambar garis. Jadi gridScale
10 berarti menggambar garis grid setiap 10 unit.
Untuk menggambar garis grid, kita menggunakan fungsi pembantu drawLine()
; sedangkan untuk warna garis grid, kita mengambilnya dari variabel options.gridColor
. Perlu diketahui bahwa koordinat canvas dimulai dari 0,0
di sudut kiri atas dan naik ke arah kanan dan bawah, sementara nilai grid kita meningkat nilainya dari bawah ke arah atas. Itulah sebabnya kita menggunakan 1 - gridValue/maxValue
dalam rumus yang menghitung nilai gridY
.
Untuk setiap garis grid, kita juga menggambar nilai garis grid 2 piksel di atas garis grid (karena itulah kita memiliki gridY - 2
untuk koordinat Y dari teks).
Selanjutnya kita menggambar batang dengan menggunakan fungsi pembantu drawBar()
. Matematika untuk menghitung tinggi dan lebar masing-masing batang sangat mudah; itu memperhitungkan padding dan nilai dan warna untuk setiap kategori dalam model data diagram.
Menggunakan Komponen Diagram Batang
Sekarang mari kita lihat bagaimana menggunakan kelas Barchart
yang diterapkan di atas. Kita perlu menjalankan kelas dan memanggil fungsi draw()
. Tambahkan kode berikut ke file script.js
:
1 |
var myBarchart = new Barchart( |
2 |
{
|
3 |
canvas:myCanvas, |
4 |
padding:10, |
5 |
gridScale:5, |
6 |
gridColor:"#eeeeee", |
7 |
data:myVinyls, |
8 |
colors:["#a55ca5","#67b6c7", "#bccd7a","#eb9743"] |
9 |
}
|
10 |
);
|
11 |
myBarchart.draw(); |
Kode membuat instance baru dari kelas Barchart
dengan opsi yang diperlukan. Memuat index.html
di browser harus menghasilkan hasil seperti ini:



Menambahkan Nama Seri Data dan Legenda Diagram
Untuk menambahkan nama seri data di bawah diagram, kita perlu menambahkan kode berikut di file script.js
setelah for-loop
yang menggambar batang:
1 |
...
|
2 |
//drawing series name
|
3 |
this.ctx.save(); |
4 |
this.ctx.textBaseline="bottom"; |
5 |
this.ctx.textAlign="center"; |
6 |
this.ctx.fillStyle = "#000000"; |
7 |
this.ctx.font = "bold 14px Arial"; |
8 |
this.ctx.fillText(this.options.seriesName, this.canvas.width/2,this.canvas.height); |
9 |
this.ctx.restore(); |
10 |
...
|
Kita juga perlu mengubah cara kita memanggil komponen Barchart
seperti ini:
1 |
var myBarchart = new Barchart( |
2 |
{
|
3 |
canvas:myCanvas, |
4 |
seriesName:"Vinyl records", |
5 |
padding:20, |
6 |
gridScale:5, |
7 |
gridColor:"#eeeeee", |
8 |
data:myVinyls, |
9 |
colors:["#a55ca5","#67b6c7", "#bccd7a","#eb9743"] |
10 |
}
|
11 |
);
|
12 |
myBarchart.draw(); |
Dan beginilah hasilnya:



Untuk menambahkan legenda, pertama kita perlu memodifikasi index.html
agar terlihat seperti ini:
1 |
<html>
|
2 |
<body>
|
3 |
<canvas id="myCanvas" style="background: white;"></canvas> |
4 |
<legend for="myCanvas"></legend> |
5 |
<script type="text/javascript" src="script.js"></script> |
6 |
</body>
|
7 |
</html>
|
Tag legend
akan digunakan sebagai tempat untuk legenda diagram. Atribut for
menghubungkan legenda ke canvas yang memegang diagram. Kita sekarang perlu menambahkan kode yang menciptakan legenda. Kita akan melakukan ini di file index.js
setelah kode yang menggambar nama seri data. Kode ini mengidentifikasi tag legend
yang sesuai dengan diagram, dan akan menambahkan daftar kategori dari model data diagram bersamaan dengan warna yang sesuai. File index.js
yang dihasilkan akan terlihat seperti ini:
1 |
var myCanvas = document.getElementById("myCanvas"); |
2 |
myCanvas.width = 300; |
3 |
myCanvas.height = 300; |
4 |
|
5 |
var ctx = myCanvas.getContext("2d"); |
6 |
|
7 |
function drawLine(ctx, startX, startY, endX, endY,color){ |
8 |
ctx.save(); |
9 |
ctx.strokeStyle = color; |
10 |
ctx.beginPath(); |
11 |
ctx.moveTo(startX,startY); |
12 |
ctx.lineTo(endX,endY); |
13 |
ctx.stroke(); |
14 |
ctx.restore(); |
15 |
}
|
16 |
|
17 |
function drawBar(ctx, upperLeftCornerX, upperLeftCornerY, width, height,color){ |
18 |
ctx.save(); |
19 |
ctx.fillStyle=color; |
20 |
ctx.fillRect(upperLeftCornerX,upperLeftCornerY,width,height); |
21 |
ctx.restore(); |
22 |
}
|
23 |
|
24 |
var myVinyls = { |
25 |
"Classical music": 10, |
26 |
"Alternative rock": 14, |
27 |
"Pop": 2, |
28 |
"Jazz": 12 |
29 |
};
|
30 |
|
31 |
var Barchart = function(options){ |
32 |
this.options = options; |
33 |
this.canvas = options.canvas; |
34 |
this.ctx = this.canvas.getContext("2d"); |
35 |
this.colors = options.colors; |
36 |
|
37 |
this.draw = function(){ |
38 |
var maxValue = 0; |
39 |
for (var categ in this.options.data){ |
40 |
maxValue = Math.max(maxValue,this.options.data[categ]); |
41 |
}
|
42 |
var canvasActualHeight = this.canvas.height - this.options.padding * 2; |
43 |
var canvasActualWidth = this.canvas.width - this.options.padding * 2; |
44 |
|
45 |
//drawing the grid lines
|
46 |
var gridValue = 0; |
47 |
while (gridValue <= maxValue){ |
48 |
var gridY = canvasActualHeight * (1 - gridValue/maxValue) + this.options.padding; |
49 |
drawLine( |
50 |
this.ctx, |
51 |
0, |
52 |
gridY, |
53 |
this.canvas.width, |
54 |
gridY, |
55 |
this.options.gridColor |
56 |
);
|
57 |
|
58 |
//writing grid markers
|
59 |
this.ctx.save(); |
60 |
this.ctx.fillStyle = this.options.gridColor; |
61 |
this.ctx.textBaseline="bottom"; |
62 |
this.ctx.font = "bold 10px Arial"; |
63 |
this.ctx.fillText(gridValue, 10,gridY - 2); |
64 |
this.ctx.restore(); |
65 |
|
66 |
gridValue+=this.options.gridScale; |
67 |
}
|
68 |
|
69 |
//drawing the bars
|
70 |
var barIndex = 0; |
71 |
var numberOfBars = Object.keys(this.options.data).length; |
72 |
var barSize = (canvasActualWidth)/numberOfBars; |
73 |
|
74 |
for (categ in this.options.data){ |
75 |
var val = this.options.data[categ]; |
76 |
var barHeight = Math.round( canvasActualHeight * val/maxValue) ; |
77 |
drawBar( |
78 |
this.ctx, |
79 |
this.options.padding + barIndex * barSize, |
80 |
this.canvas.height - barHeight - this.options.padding, |
81 |
barSize, |
82 |
barHeight, |
83 |
this.colors[barIndex%this.colors.length] |
84 |
);
|
85 |
|
86 |
barIndex++; |
87 |
}
|
88 |
|
89 |
//drawing series name
|
90 |
this.ctx.save(); |
91 |
this.ctx.textBaseline="bottom"; |
92 |
this.ctx.textAlign="center"; |
93 |
this.ctx.fillStyle = "#000000"; |
94 |
this.ctx.font = "bold 14px Arial"; |
95 |
this.ctx.fillText(this.options.seriesName, this.canvas.width/2,this.canvas.height); |
96 |
this.ctx.restore(); |
97 |
|
98 |
//draw legend
|
99 |
barIndex = 0; |
100 |
var legend = document.querySelector("legend[for='myCanvas']"); |
101 |
var ul = document.createElement("ul"); |
102 |
legend.append(ul); |
103 |
for (categ in this.options.data){ |
104 |
var li = document.createElement("li"); |
105 |
li.style.listStyle = "none"; |
106 |
li.style.borderLeft = "20px solid "+this.colors[barIndex%this.colors.length]; |
107 |
li.style.padding = "5px"; |
108 |
li.textContent = categ; |
109 |
ul.append(li); |
110 |
barIndex++; |
111 |
}
|
112 |
}
|
113 |
}
|
114 |
|
115 |
|
116 |
var myBarchart = new Barchart( |
117 |
{
|
118 |
canvas:myCanvas, |
119 |
seriesName:"Vinyl records", |
120 |
padding:20, |
121 |
gridScale:5, |
122 |
gridColor:"#eeeeee", |
123 |
data:myVinyls, |
124 |
colors:["#a55ca5","#67b6c7", "#bccd7a","#eb9743"] |
125 |
}
|
126 |
);
|
Yang akan menghasilkan hasil akhir terlihat seperti ini:



Selamat
Kita telah melihat bahwa menggambar diagram menggunakan canvas HTML5 sebenarnya tidak terlalu sulit. Ini hanya membutuhkan sedikit matematika dan sedikit pengetahuan JavaScript. Anda sekarang memiliki semua yang Anda butuhkan untuk menggambar diagram batang Anda sendiri.
Jika Anda menginginkan solusi cepat dan mudah untuk tidak hanya membuat diagram batang, tapi juga banyak jenis diagram lainnya, Anda dapat men-download Infographic Charts and Graphics HTML Tags Library atau plugin WordPress pasangannya Charts and Graphs WordPress Visual Designer.


