Advertisement
  1. Code
  2. JavaScript

Cara Menggambar Diagram Batang Menggunakan JavaScript dan Canvas HTML5

Scroll to top
Read Time: 11 min

Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

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.

Infographic charts and graphics HTML tags libraryInfographic charts and graphics HTML tags libraryInfographic charts and graphics HTML tags library
Pustaka Diagram Infografis 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:

Components of a bar chartComponents of a bar chartComponents of a bar chart
  • 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:

  1. ctx: mengacu pada konteks gambar
  2. startX: koordinat X dari titik awal garis
  3. startY: koordinat Y dari titik awal garis
  4. endX: koordinat X dari titik akhir garis
  5. endY: koordinat Y dari titik akhir garis
  6. 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:

  1. ctx: mengacu pada konteks gambar
  2. upperLeftCornerX: koordinat X dari pojok kiri atas batang
  3. upperLeftCornerY: koordinat Y dari pojok kiri atas batang
  4. width: lebar batang
  5. height: tinggi batang
  6. 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:

Simple bar chart using html5 canvasSimple bar chart using html5 canvasSimple bar chart using html5 canvas

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:

Bar chart with data series titleBar chart with data series titleBar chart with data series title

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:

HTML5 canvas bar chart final resultHTML5 canvas bar chart final resultHTML5 canvas bar chart final result

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.

Infographic charts and graphics HTML tags libraryInfographic charts and graphics HTML tags libraryInfographic charts and graphics HTML tags library
Pustaka Diagram Infografis dari CodeCanyon
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.