# js學習60天-c3.js筆記
碰新東西前總是有許多檻要過,心裡總是會這樣想:「又是新東西,好像很難......」,但腳已經跨一半了,怎麼樣也想要走完60關呀。
以此鼓勵自己看到新東西不要怕,慢慢拆開研究,首先就先看看別人怎麼做吧!
## 動手寫之前
> [六角的影片入門,了解c3.js是什麼](https://www.youtube.com/watch?v=0PQ8VOsyjzw)
> [再看看官網範例,Bar Chart長怎樣](
https://c3js.org/examples.html)
```javascript=
var chart = c3.generate({
data: {
columns: [
['data1', 30, 200, 100, 400, 150, 250],
['data2', 130, 100, 140, 200, 150, 50]
],
type: 'bar'
},
bar: {
width: {
ratio: 0.5 // this makes bar width 50% of length between ticks
}
// or
//width: 100 // this makes bar width 100px
}
});
```
> [拜讀Tim大大的手把手教學文](https://hsuchihting.github.io/javascript/20200715/3292510004/)
> [做作業前先照著Tim的教學練習一遍](https://codepen.io/sylviekuo/details/qBbLgbP)
## 一、起手式
先載入所需CDN,由於 C3 是基於 D3 延伸的框架,所以需要先載入 D3
* https://cdnjs.cloudflare.com/ajax/libs/d3/5.16.0/d3.min.js
* https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.18/c3.min.js
* https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.18/c3.css
因為要串api,也載入axios
* https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js
接下來在html插入div放圖表,初始設定差不多就完成了
```html=
<div id="chart"></div>
```
## 二、寫入Javascript
### 任務:
這次要串的[api](https://raw.githubusercontent.com/hexschool/hexschoolNewbieJS/master/data.json)是js學徒班的闖關完成率,想要做一個橫軸X呈現完成率,縱軸Y學員名字的圖表。
> 先寫出一個待放資料的空陣列
```javascript=
const processList = []; // 完成率
const nameList = [] ; // 參加者名單
```
### 插入所需資料
```javascript=
axios.get(url).then((response) => {
data = response.data;
sortData(data);
render(processList,nameList);
}).catch(err => {
console.log(err);
});
```
### 整理資料
```javascript=
function sortData(){
data.sort((a, b) => parseInt(b.process) - parseInt(a.process)) //完成率資料排序,多到少
data.forEach((item) => {
processList.push(parseFloat(item.process) ); //把完賽率資料推到processList[]中,忽略小數點
nameList.push(item.name); //把參賽者資料推到nameList[]中
});
}
```
### c3.js圖表畫面處理
主要佈局
```javascript=
function render (){
var chart = c3.generate({
bindto: "#chart",
data: {
columns: [
processList
], //主資料
type: 'bar', //選擇chart類型
colors:{
},
},
size: {
height: processList.length * 35, //調整長條圖距離
width: 1000
},
axis;{
},
})
}
```
軸axis的設定
```javascript=
axis: {
rotated: true,//這邊做反轉,才會得到我們想要的X軸是完成率、Y軸名字
x: {
show: true,
type: "category",
categories: nameList,
label: {
text: '參加者名單', //加入標籤名稱
position: 'outer-middle' //標籤位置
},
tick: {
multiline: false
}
},
y: {
show: true,
max: 100,
},
}
```
至於Y軸的完成率,因為是主要顯示的資料,所以要回頭寫在一開始準備的空陣列中,這樣就可以正確顯示標籤文字。
```javascript=
const processList = ['完成率%']
```
最後設定主資料data內樣式顏色
```javascript=
colors: {'完成率%': '#aadddd',}
```
## 噢噢噢終於完成了啦 [完整codepen在這](https://codepen.io/sylviekuo/pen/gOPZNPb?editors=1011)
---
> 參考自[Erica](https://hackmd.io/4rYt6CF9TMCmmFqPnF8Tig?view)、[Tim Hsu](https://hsuchihting.github.io/javascript/20200715/679666643/)的技術文,非常詳細,值得一讀再讀