만들어야 할 원형 차트는 바깥쪽에 퍼센트가 있고 안쪽 차트는 컬러가 나뉜다.
겉에는 고정적인 모양이라 css conic-gradient 속성을 이용해 만들어주고 안쪽은 데이터가 있기 때문에 d3.js를 이용해 script로 요소를 추가하려고 한다.
.chart {
background: conic-gradient(
#26BDE2 0% 20%, #FD9D26 20% 40%,
#FE3A21 40% 60%, #DD1367 60% 80%,
#56C02B 80% 100%);
}
(색상 시작 지점 끝 지점)을 넣어 원형을 만들 수 있다
MDN문서 - https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/conic-gradient()
<script src="https://d3js.org/d3.v5.min.js"></script>
//차트 사이즈 지정
const pieW = 360, pieH = 360;
/* 바깥 원형이 각 20% 나뉨 - 개수에 따라 사이즈 변수에 담아줌 */
const deg2 = Number(20/2);
const deg3 = Number(20/3);
const deg4 = Number(20/4);
/*
chart data
=> size만 우선 사용, 다른 데이터는 임의로 넣어둠
*/
const pieData = [
{cate: 'A', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'B', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'C', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'A', name: 'Clarity', score: 30, avg: 20, size: deg4},
{cate: 'B', name: 'Clarity', score: 30, avg: 20, size: deg4},
{cate: 'C', name: 'Clarity', score: 30, avg: 20, size: deg4},
{cate: 'D', name: 'Clarity', score: 30, avg: 20, size: deg4},
{cate: 'A', name: 'Clarity', score: 30, avg: 20, size: deg2},
{cate: 'B', name: 'Clarity', score: 30, avg: 20, size: deg2},
{cate: 'A', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'B', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'C', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'A', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'B', name: 'Clarity', score: 30, avg: 20, size: deg3},
{cate: 'C', name: 'Clarity', score: 30, avg: 20, size: deg3},
];
//color data
const colorData = [
'#26BDE2', '#0D97D9', '#05689D',
'#FD9D26', '#DDA83A', '#BF8B2E', '#916517',
'#FE3A21', '#FD6925',
'#DD1367', '#B41055', '#9C0142',
'#56C02B', '#4C9F38', '#3F7E44'
];
//pie 생성
const pie = d3.pie().value(d=> d.size).sort(null);
//호 생성
const arc = d3.arc().innerRadius(0).outerRadius(Math.min(pieW, pieH)/2)
const arcs = pie(pieData);
const colors = d3.scaleOrdinal(colorData);
//요소 추가
const svg = d3.select('.chart_sub')
.append('svg')
.attr('width', pieW)
.attr('height', pieH);
const g = svg.append('g')
.attr('transform', `translate(${pieW/2}, ${pieH/2})`);
g.selectAll('path')
.data(arcs)
.enter().append('path')
.attr('fill', (d, i) => colors(i) )
.attr('d', arc);
const pie = d3.pie().value(d=> d.size).sort(null);
pie() : 새로운 기본값의 파이 모양의 생성
const pie = d3.pie().value(d=> d.size).sort(null);
value로 pieData에 담겨있는 size를 넣어주고 sort(null)을 넣어 데이터 순으로 정렬해준다.
sort 안 넣으면 순서대로 나오지 않았다. 컬러가 뒤죽박죽이었음
arc() : 호를 생성한다.
innerRadius() :안쪽 지름 값. 값을 넣으면 중간에 원이 생긴다. 도넛 모양이 된다.
outerRadius() : 바깥쪽 지름 값
const svg = d3.select('.chart_sub')
.append('svg')
.attr('width', pieW)
.attr('height', pieH);
const g = svg.append('g')
.attr('transform', translate(${pieW/2}, ${pieH/2})
);
g.selectAll('path')
.data(arcs)
.enter().append('path')
.attr('fill', (d, i) => colors(i) )
.attr('d', arc);
-모든 path 요소를 선택하고 데이터를 바인딩.
data(arcs).enter() : 가져온 데이터 개수만큼 실행한 후 path 요소를 넣어준다.
fill속성을 추가해 배경색을 준다.
d 속성에 arc 값을 넣어준다.
path 태그의 d 속성 = 패스 데이터( d ) 속성은 복잡한 도형의 모양을 그리는데 사용