Table of Contents

以往當我們想要從資料庫讀資料並轉化成網頁上的動態向量圖表時,可能常會想到的是具備良好設計彈性的開源工具 d3.js ,但實作與風格微調的步驟較為繁雜、學習曲線較為陡峭,使得要在網頁上顯示即時圖表這件事一直都是個有點麻煩的工作。不過,近來流行的幾款 JavaScript 圖表工具比如:Chart.js、amCharts、和 Infogram...等等,不僅在實作資料庫自動生成圖表上簡化很多,還能與使用者進行互動,也是很不錯的替代方案。

Chart.js:輕量化、且免費開源的 HTML5 圖表庫

而在在這麼多工具裡面,Chart.js 算是其中較為通用的,一般普通使情境當中會用到的圖表這裡大都能夠找到。以 3.5.1 版本來說,就有 Line Chart 折線圖、Bar Chart 長條圖、Radar Chart 雷達圖、Doughnut and Pie Charts 甜甜圈圖或圓餅圖、Polar Area Chart 極座標圓餅圖、Bubble Chart 泡泡圖、Scatter Chart 散點圖、以及 Area Chart 區域圖這麼多種,而且不僅這些圖可以互相 mix 來顯示之外,每種都是動態即時顯示:

除此之外,在軸線、格線、資料標籤、以及各種風格的設置,也都有相對應的屬性可以直接使用:

試做一個看看

說了這麼多,不如來實際做一個看看,比如假設我們想要利用 Chart.js 來繪製一個「台灣過去十年平均降雨日數」的長條圖,該從哪一步開始呢?

首先,我們需要準備一個空白的 HTML canva,id 就取名為 rainfallChart 好了:

<canvas id="rainfallChart"></canvas>

接下來在 html 把 Chart.js 載進來。你可以選擇從 Chart.js 的官方網站直接下載,或是使用官方提供的 CDN 來快速載入:

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/Chart.js"></script>

然後到 javascript 將想要填入的資料給放進圖表內,比如年份、標籤名稱、長條的底色及邊框、以及每年的降雨資料等 (這裡是隨意填進去的數字):

var rainfallData = {

   labels: ["2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020"], // 年份

   datasets: [{

       label: '平均降雨日數', // 標籤名稱

       backgroundColor: "#42A5F5", // 長條的底色

       borderColor: "#1E88E5", // 長條邊框顏色

       borderWidth: 1, // 邊框寬度

       data: [120, 110, 130, 140, 150, 160, 170, 160, 150, 140], // 平均降雨日數資料

   }]

};

最後再將這些資料透過 Chart.js 轉化為視覺化的圖表:

function drawRainfallChart(ctx, data) {

   new Chart(ctx, {

       type: 'bar', // 圖表類型

       data: data,

       options: {

           responsive: true,

           legend: {

               display: true, // 顯示圖例

           },

           tooltips: {

               enabled: true, // 顯示工具提示

           },

           scales: {

               xAxes: [{

                   display: true, // 顯示 X 軸

               }],

               yAxes: [{

                   display: true, // 顯示 Y 軸

               }]

           },

       }

   });

}

window.onload = function () {

   var ctx = document.getElementById("rainfallChart").getContext("2d");

   drawRainfallChart(ctx, rainfallData);

};

出來的結果就會是這樣子:

而且當把游標移到想要查看的資料列時,還會自動顯示該列的相關資訊: