C3.js基本使用方法
這一周六角學院 JS 直播班教的是 C3.js 這個畫圖表的套件。
對於一個畫圖表快二十年的人,看到這個套件感到很親切。不同於手工畫的圖表,C3.js可以透過程式把資料帶入,只要資料更新,圖表也同步更新。
其實我也使用過另外一套圖表套件 Chart.js,那是在前公司結束前,做了一個 COVID-19 的網頁,裡面圖表就是用 Chart.js 做的,那時還不會串 API ,也不會篩選資料,每天都用手動把資料更新,真的很傻B!
誠如老師講的,不用真的把文件整個看過才會用,基本上只要抓住一些設定的要點,就可以做出還不錯的圖表。以下就整理了一些我試過可行的設定,方便未來要用時,可以快速上手:
導入方法
在HTML中插入以下程式碼:
- CSS要放在自己寫的CSS之前。
- 透過CDN抓進來使用的 d3.js 與 c3.js 也要放在自己寫的 JS檔之前。
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.18/c3.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.16.0/d3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.18/c3.js"></script>
曲線圖 Line Chart
基本上套件就是一個物件,而所有的圖表的資料與外觀都在 generate 這個屬性的函式參數裡面設定。而 generate 函式的參數也是一個物件。
可以透過 bindto
這個屬性把圖表綁定到 HTML 的 DOM 元素上。
var chart = c3.generate({
bindto: ".chart",
data: {
// x 是設定 x 軸刻度的格式與數據
x: "date",
columns: [
//"date" 綁定到 x 屬性的值"date" ,日期是字串格式
["date", "2021-11-21", "2021-11-22", "2021-11-23", "2021-11-24"],
//資料部分,可以透過 變數 帶入
["data1", 30, 200, 100, 400],
["data2", 50, 20, 10, 40]
],
// 顯示線圖上面每一點的資料
// labels: true
// 每一點的資料顯示 $
labels: {
format: {
data1: d3.format("$")
}
}
},
//設定一組色票讓data自己捉 線 的顏色
color: {
pattern: ["#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2"]
},
// 設定顯示格線(虛線)
grid: {
x: {
show: true
},
y: {
show: true
}
},
//整體尺寸 不設定的話,圖表可以自適應地伸縮
size: {
width: 780,
height: 400
},
//padding 會壓縮線圖的大小
padding: {
top: 0,
//right設太小,會讓最右側刻度的日期被遮住
right: 100,
bottom: 10,
left: 100
},
//設定坐標軸格式
axis: {
x: {
type: "timeseries",
//刻度
tick: {
count: 4,
format: "%Y-%m-%d",
// outer 拿掉圖表最右側多出來的刻度
outer: false
},
// 設定x軸說明 或是 數據 的單位
label: {
text: "日期",
//label 橫式的位置有以下幾種
//inner-right [default],inner-center,inner-left,outer-right,outer-center,outer-left
position: "outer-center"
}
},
y: {
show: true,
tick: {
//label 的位置有以下幾種
//inner-right [default],inner-center,inner-left,outer-right,outer-center,outer-left
position: "inner-center",
// Y軸 數字前面加上 $ 字號
format: d3.format("$,")
//format: function (d) { return "$" + d; }
},
label: {
text: "價格",
// inner-right : default, inner-center, inner-left, outer-right, outer-center, outer-left
position: "outer-middle"
}
}
},
//設定圖例
legend: {
show: true,
//圖例的位置只有 'right' 與 'bottom'
position: "bottom"
},
//圖表的標題
title: {
text: "好心指數"
}
});
CSS設定的部分:
// CSS
.c3-title {
font-size: 32px;
}
.c3-axis-y text {
fill: red;
font-size: 12px;
}
.c3-axis-x text {
font-size: 12px;
fill: green;
}
.c3-axis-y text {
font-size: 10px;
fill: green;
letter-spacing: 2px;
}
.c3-axis-y .c3-axis-y-label {
font-size: 20px;
fill: red;
}
.c3-line {
stroke-width: 3px;
}
.c3-circle {
fill: blue !important;
}
Bar Chart 長條圖
Bar Chart 的設定大同小異,差別在於 axis 可以設定 rotated: false
, 坐標軸翻轉,由垂直轉為水平。
var chart = c3.generate({
bindto: ".chart",
//是bind,不是bid
data: {
x: "x",
columns: [
[
"x",
"2013-01-01",
"2013-01-02",
"2013-01-03",
"2013-01-04",
"2013-01-05"
],
["data1", 30, 200, 100, 400, 150],
["data2", 130, 100, 140, 200, 150]
],
//type 設定圖表類型
type: "bar"
},
bar: {
//設定長條圖每一條寬度
width: {
ratio: 0.5 // this makes bar width 50% of length between ticks
}
// or
//width: 100 // this makes bar width 100px
},
//設定一組色票讓data自己捉
color: {
pattern: ["#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2"]
},
// 設定顯示格線(虛線)
grid: {
x: {
show: true
},
y: {
show: true
}
},
//整體尺寸 不設定的話,圖表可以自適應地伸縮
size: {
width: 780,
height: 400
},
padding: {
top: 0,
right: 200,
bottom: 10,
left: 100
},
axis: {
//rotated 設定坐標軸翻轉
rotated: false,
x: {
type: "category",
// 設定x軸說明 或是 數據 的單位
label: {
text: "日期",
//label 橫式的位置有以下幾種
//inner-right [default],inner-center,inner-left,outer-right,outer-center,outer-left
position: "outer-center"
}
},
y: {
tick: {
position: "inner-center",
// Y軸 數字前面加上 $ 字號
format: d3.format("$,")
//format: function (d) { return "$" + d; }
},
label: {
text: "價格",
// inner-right : default, inner-center, inner-left, outer-right, outer-center, outer-left
position: "outer-middle"
}
}
},
legend: {
show: true,
//圖例的位置 'bottom'
position: "bottom"
},
//圖表的標題
title: {
text: "銷售金額"
}
});
Pie Chart 餅圖
var chart = c3.generate({
bindto: ".chart",
data: {
// iris data from R
columns: [
["iPhone", 30],
["其他手機", 120]
],
type: "pie",
labels: true
},
//設定一組色票讓data自己捉 線 的顏色
color: {
pattern: ["#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2"]
},
//整體尺寸,本來置中,會往畫面左邊靠
size: {
width: 780,
height: 400
},
//padding 會壓縮線圖的大小
padding: {
top: 0,
right: 100,
bottom: 10,
left: 100
},
//設定圖例
legend: {
show: true,
//圖例的位置只有 'right' 與 'bottom'
position: "bottom"
},
//pie 及 donut 圖 label 設定的方式和其他圖不一樣,要注意
pie: {
label: {
show: true,
format: function (value, ratio, id) {
return d3.format("$")(value);
}
}
},
//圖表的標題
title: {
text: "銷售金額比例"
}
});
Donut Chart 甜甜圈圖
var chart = c3.generate({
bindto: ".chart",
data: {
// iris data from R
columns: [
["iPhone", 30],
["其他手機", 120]
],
type: "donut",
labels: true
},
//設定一組色票讓data自己捉 線 的顏色
color: {
pattern: ["#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2"]
},
//整體尺寸,本來置中,會往畫面左邊靠
size: {
width: 780,
height: 400
},
//padding 會壓縮線圖的大小
padding: {
top: 0,
//right設太小,會讓最右側刻度的日期被遮住
right: 100,
bottom: 10,
left: 100
},
//設定圖例
legend: {
show: true,
//圖例的位置只有 'right' 與 'bottom'
position: "bottom"
},
//pie 及 donut 圖 label 設定的方式和其他圖不一樣,要注意
donut: {
title: "地區",
//控制環的粗細
width:80,
label: {
show: true
}
},
//圖表的外部標題
title: {
text: "銷售金額比例"
}
});
先整理以上這些基本設定,以後若有新發現在隨時更新!如果有錯誤的地方,也請不吝告訴我。感謝!
參考資料
C3.js基本使用方法
https://popeye-ux.github.io/2021/11/29/c3js/