# SSH.js <small> Super SVG Helper, so called SSH is a SVG library, makes easy to handle and modify svg elements in your web project.</small> ## 기능과 특징 > <strong>SVG와 HTML DOM 요소를 쉽게 생성하고 속성을 변형하여 화면에 적용할 수 있는 모듈</strong>로서 데이터 시각화를 편리하게 구성하도록 한다. #### collaborators | 팀원 | 아이디 | | -------- | -------- | |전예진 | [pikpokjeon](https://github.com/pikpokjeon)| | 현| [ Aiden-leee](https://github.com/Aiden-leee)| | 김진희| [ dev-jinheekim](https://github.com/dev-jinheekim)| --- ## 차트 프로젝트 | 토픽 | 규칙 | 레퍼런스 | | -------- | -------- | -------- | |1. 스터디 방법 |- 각자 맡은 토픽에 따른 설명과, 부가 코트를 작성합니다. <br /> - 다음 회의까지 각 대분류 토픽의 폴더에 마크다운으로 작성한 결과물을 제출합니다.|```파일명: [토픽이름]---[이름] ```<br /> ``` 위치: /agenda/chart/파일명.md``` <br />토픽 : 차트 초기정의 <br /> 설명: ... <br /> 코드: 1. ... 2. ... | |2. 토픽 설명 | - 비교 가능한 코드가 있다면 어떤 차이점이 있는지 서술합니다<br /> - 이해를 돕기위한 코드조각을 첨부합니다| |3. 회의 방법 |- 매주 한번 온라인 미팅을 통해 각자 준비한 코드를 화면공유를 통해 리뷰하는 시간을 갖습니다. <br />- 유닛 테스트 툴을 사용하셔도 좋습니다. 함수가 작동하는 것을 보여주세요. |플랫폼: gather.town <br /> 방식: 화면공유로 정리한 내용을 발표하고, JS 런타임 환경에서 함수가 작동하는 것을 시연합니다. <br /> | | 4. 마지막 단계 | - 회의 마지막 단계에, 자신이 가장 자신있는 토픽을 선택합니다.<br /> | svg 요소 생성 함수 코드짜기..| --- ## List to study - [ ] 시작 날짜 - [x] 완료 시 체크 ### [ ] 1. 차트에 필요한 요소 - [x] 6월 6일 - chart 기능 - 그리드 ( 가로/ 세로 ) - 레전드 - 초기 로딩 애니메이션 - 제로라인(음수포함) 포맷 - 날짜 (yyyy-MM-dd, yy/mm/dd, mm/dd ...) - 숫자 단위 (1K, 10M, 10B, 원, $, USD...) 숫자 소수점 단위 - Bar option - stacks : - Y축에 해당하는 데이터의 절대값으로 표시 - Y축 전체를 기준으로 데이터의 상대값을 표시 기능 - stacks 절대값 / 상대값 표현 - stack 영역 마우스 호버 ( 해당 영역 포커스 ) - 툴팁: 해당 영역 bar 데이터 정보 - 툴팁 호버 - 전체 툴팁 표시 - 선 호버 - 선 영역 구분표시 - Line ( path ) - curves - stacks - arcs ### [ ] 2. 차트 정의 방식 - [ ] 6월 18일 #### 정의 - 차트를 만든다. 문서가 없어도 사용가능할 정도로 직관적이고 일관성있게 만든다. - x축과 y축의 데이터 갯수는 일치해야한다. - 차트 옵션은 stacked, percentage가 있다. - 툴팁은 formatter를 이용하여 값을 전달받아 커스터마이징이 가능하다. - 레전드, 툴팁, 그리드 등의 스타일은 기본 스타일로 우선 제공한다. + 데이터 변경을 위한 함수 추가가 필요함. ```javascript xAxis = ['2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-06-05']; chartOptions = { title: { text: '판매량', }, series: [ { type: 'line || bar', legend: '사과', values: { x: xAxis, y: [10, 20, 30 , 40, 10], }, }, { type: 'line || bar', legend: '바나나', values: { x: xAxis, y: [15, 25, 35 , 45, 15], }, }, { type: 'line || bar', legend: '딸기', values: { x: xAxis, y: [1, 2, 3 , 4, 1], }, }, ], axis: { x: { name: '과일의 종류', // 축 이름 }, y: { name: '판매개수', // 축 이름 labels: '{value}개', // 레이블 커스터마이징 }, }, options: { stack: true, percent: true, tooltip: { formatter: (value) => { return customValue; }, // 툴팁 커스터마이징 }, }, } chart.init(chartOptions); ``` #### 요소 생성 예시 ``` javascript const svg = ssh.create('svg') .attr({ height, width, viewbox: `0 0 ${ width } ${ height } ` }).toChart const bar = ssh.group('name').create('rect').type('histogram') const line = ssh.group('name2').create('path').type('curve') const axis = svg.group('axis').axis({ x: ['cost', { visibility: 'hiddne' }], y: ['price', { color: 'red' }] }) const chart1 = svg.appendAll(bar) .data('legendTitle1', [{ x: 'A', y: 1 }, { x: 'C', y: 2 }]) .attr({ background: 'red' }) .animate({}) const chart2 = svg.appendAll(line) .data('legendTitle2', [{ x: 'B', y: 3 }, { x: 'A', y: 4 }]) ``` ### [ ] 3. 차트 정의 객체에 필요한 요소생성 - [ ] 6월 18일 * 차트에 필요한 html요소 * 차트에 필요한 svg요소 * 엘리먼트에 속성으 부여하는 함수 * 엘리먼트를 생성하는 함수 * 차트 구성에 필요한 데이터 * 차트 요소 생성에 필요한 함수 ### [ ] 4. HTML요소 생성 * 사전에 필요한 html요소를 동적으로 생성 ### [ ] 5. SVG요소 생성 - 차트에 필요한 SVG요소를 생성하는 함수 - 생성된 SVG에 속성을 부여하는 방법 ### [ ] 6. 차트에 필요한 함수 - [ ] 동적 데이터에 따른 x/y좌표 path를 만들어주는 함수 - ### Commit Convention ``` [ keyword ] : 커밋 내용 (파일이름) keywords : docs : 문서화, style : 스타일 관련, build : 빌드와 배포, fix: 에러 수정, feature: 기능 추가, refactor: 코드 개선 ``` - [x] 첫 회의 | Column 1 | Column 2 | Column 3 | | -------- | -------- | -------- | | Text | Text | Text | ### 필요한 기능 - 아이디어 >목적은 SVG와 HTML DOM 요소를 쉽게 생성하고 속성을 변형하여 화면에 적용할 수 있는 모듈을 만드는 것' ## 차트 ### 1. 유형 ![](https://i.imgur.com/Q3r5WnB.png) - chart 기능 - 그리드 ( 가로/ 세로 ) - 레전드 - 초기 로딩 애니메이션 - 제로라인(음수포함) 포맷 - 날짜 (yyyy-MM-dd, yy/mm/dd, mm/dd ...) - 숫자 단위 (1K, 10M, 10B, 원, $, USD...) 숫자 소수점 단위 - Bar option - stacks : - Y축에 해당하는 데이터의 절대값으로 표시 - Y축 전체를 기준으로 데이터의 상대값을 표시 기능 - stacks 절대값 / 상대값 표현 - stack 영역 마우스 호버 ( 해당 영역 포커스 ) - 툴팁: 해당 영역 bar 데이터 정보 -Line ( path ) - curves - stacks - straight 기능 - 툴팁 호버 - 전체 툴팁 표시 - 선 호버 - 선 영역 구분표시 ### 2. 기능정리 * 차트는 바 와 라인을 지원한다. * 바와 라인은 같이 사용할 수 있어야 한다. * 바와 라인은 스택 옵션을 가진다. * 인터렉션은 호버시 툴팁 띄우기, 호버시 축선 표시, 레전드 클릭시 해당 데이터 토글을 구현한다. * 기본 요소 스타일 커스터마이징 옵션은 추후 적용이 가능하도록 고려하거나 테마로 기본적으로 적용한다. ## Using SSH.js ### 1. Chart Helper #### 공통 기능 - 타입에 따른 Path 계산 - 유저 데이터를 이용한 X, Y 좌표 계산 - svg 요소 생성 및 속성 변경 - svg 요소에 사용자 이벤트 적용 #### Collaborators #### 현님 --- - Init attribute 정의 ```javscript { type: bar, // ["bar", "line" ...] 차트 타입 title: { text: "차트 제목", color: "차트색상", fontSize: "14px" }, height: "차트 높이", width: "차트 넓이", layout: { padding: "10px", // 차트 컨테이너 padding 값 }, tooltip: { handler: "hover", }, xAxisLabel: { display: true, text: "x축의 타이틀" }, yAxisLabel: { display: true, text: "y축의 타이틀" }, chartData: { labels: ['Jan', 'Feb', ...], legend: { display: true, position: "top" } datasets : [ { legend: "레전드 이름", backgroundColor: "색상", borderColor: "색상", textColor: "색상", data: [0, 10, 5, 2, 20, 30, 45], } ] } ], } ``` #### 예진님 --- - 차트 타입에 따른 필요한 svg 요소 정의 ``` javascript { bar: { rect: { id: ['r-1', 'r-2', 'r-3'], // 데이터 갯수에 따라 id 생성 name: 'data-rect', attribute: { "datasets의 style 속성" } }, text: { id: ['title','xAxisLabel','yAxisLabel','legend'] name: 'text', attribute: { "초기 설정의 textColor 속성들" } }, line, }, line: { path, text, line } } ``` --- - 초기 차트 속성으로 svg 객체를 생성하고 스토어에 저장 ``` javascript const initChart = (data) => { for (const [title, value] of Object.entreis(data)) { // 요소 생성함수 사용 // title: Text 요소 // height/ width: root svg 사이즈 // x,y labels: Text 요소 // chartData } } ``` --- - 초기 정의된 SVG 리스트 객체의 개별 요소를 생성 ``` javascript /** * @type svg요소 타입 (string) * @attr svg요소 속성 (obj) */ const genElement = (type, attr) => { type = document.createElementNS('http://www.w3.org/2000/svg', type) for (const [title, value] of Object.entries(attr)) { type.setAttributeNS(null, title, value) } return type } // svg 생성 사용예시 const svg = genElement("svg", {width: 1300 , height: 700} ) ``` --- ### 현님 ### 차트 옵션 & 기능 bar chart https://www.amcharts.com/demos/simple-column-chart/ 차트 생성을 할 대상 DOM 작성 ```html <div id="ssh-chart"></div> ``` 차트 생성 호출 ```javascript= // sshChart(id, chartType); let chart = sshChart("#ssh-chart", "bar"); ``` #### 차트 - 차트 배경색 - padding, margin - stacked (default: false) - stacked 일경우 꽉 채워보이기 활성화 #### x축 - title (x축의 제목) - title color - title size - title font-weight - x축의 그리드 두께 - x축의 그리드 색상 및 투명도 - text color size weight - 제로라인 (음수-양수) - grid disabled (default: false) #### y축 - title (x축의 제목) - title color - title size - title font-weight - y축의 그리드 두께 - y축의 그리드 색상 및 투명도 - text color size weight - 제로라인 (음수-양수) - grid disabled (default: false) #### 차트 레전드 - 위치 (position) - 레전드 크기 ( width, height ) - 형태 (border-radius, line, round, image..) - stroke 크기 (border) - 레전드 색상 (background) - 글자 색상 (font color) - 글자 크기 (font size) - max-width (긴 텍스트의 경우 ...잘려야함) - click 활성화 (default: true) #### 차트 커서 - xy 커서 활성화 (defulat: false) - lineX, lineY - line 색상 - line 크기 - line 투명도 및 dash style - 축 값 hover 활성화 (default: false) - 축 값 hover style #### tooltip - 툴팁 활성화 (default: false) - 배경색상 - 텍스트 색상 - 텍스트 크기 - margin, padding - 툴팁박스 크기 #### 포맷 - 날짜 (yyyy-MM-dd, yy/mm/dd, mm/dd ...) - 숫자 단위 (1K, 10M, 10B, 원, $, USD...) - 숫자 소수점 단위 --- ### 진희님 ``` ## 차트 기본 요소 * 차트 제목 * 차트 * 범례 * 축 제목 * 축 레이블 * 눈금 * 눈금선 ## 차트 유형 [차트종류14종알아보기](https://www.finereport.com/kr/%EC%B0%A8%ED%8A%B8-%EC%A2%85%EB%A5%98-14-%EC%A2%85-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0/) * 히스토그램 : x축이 의미있는 데이터 * 막대그래프 (바차트) : 데이터간 차이를 나타낼 때 유용 * 원 그래프 (파이차트) : 비례 관계를 백분률로 보여줄때 사용. * 꺾은선 그래프 (러안처트) : 증가폭, 성장치 표현에 적합. 많은 양의 데이터의 추세를 나타낼때 유용 * 산점도 * 버블차트 * 방사형 그래프 * 깔때기 도표 * 워드 클라우드 차트 * 간트 차트 (funnel plot) * 지도/맵 * 열지도 (heatmap) ### 차트에 필요한 기능 * 기본 요소 표시 여부 설정 * 기본 요소의 커스터마이징 가능 여부와 기능 (위치, 색상, 호버나 클릭 대응) * 차트 유형 설정 * 마우스 오버시 나타나는 축선 가이드, 툴팁 ``` --- ### 예진님 ![img](https://i.imgur.com/ZhW7IHS.jpg) - bar 차트 legend가 여러개 (다중 차트)인 경우 표현 - bar 차트 영역 선택시 isFocusHover 해당 영역 포커스 - 라인 차트에서 툴팁 호버 - 라인 차트 구간 표시 - 최대 최소값 고정/ 동적으로 표시 #### type ( line: curve, stack, arc), bar ``` javascript const chart1 = { title: 'title' , type: 'bar', data: [1,2,3], label: [2010,2011,2012], } const chart2 = { title: 'title' , type: 'line', data: [5,6,1], label: [2010,2011,2012], } // 각각 차트에 따라 혹은 공용으로 사용가능 const style1 = { chart: { color: 'red', //바, 선 색상 border: 'white', // 선차트에서는 무시 plot: 'red, }, font: { size: 14, color: 'white' // 명시하지 않으면 theme에 따른 디폴트 색상으로 } } // 옵션은 한번만 사용 const option = { size: { width: 1300, // 꼭 픽셀? 뷰포트 상대 사이즈사용 height: 700, }, legend: true, grid:{ }, isTooltip:true, isTooltipBox:true, isFocusHover: true, isHoverAfter: true, theme: 'dark' // 다크모드, 등 theme 사용 } const charts = [ { chart: chart1, style: style1, }, { chart: chart2, style: style1, } ] // 초기 함수에서 사용 initChart(option,charts) module.exports = {charts} // 객체만 넘길 시 ``` --- - [ ] 둘째 회의 ## 6월 6일 ## 예진 1. 이뤄야 할 것 - DOM 조작 svg와 html DOM을 편리하게 구성할 수 있는 조작 함수를 생성 엘리먼트를 생성 엘리먼트 속성을 부여 엘리먼트에 이벤트를 부여 엘리먼트로 DOM 트리를 구성 - 플러그인 데이터 필터 포맷 - 날짜, 숫자단위, 가격단위 숫자 필터 - 최소, 최대, 평균, 일정 범위 내의 커스텀 계산 이터러블 - 위와 같음 오브젝트 - 키와 밸류 값을 분리하여 적용(차트 예시로 키는 라벨 밸류는 데이터) 2. 차트를 만들 수 있는 구성 - 1. 필요한 데이터 - 차트 타입에 필요한 svg 요소 - 각 svg 요소별 속성, 이벤트, 스타일 - 차트 x / y축 필요한 데이터(객체 배열) - 2. 필요한 기능 / 이벤트 - 차트에 데이터를 표시하는 부분이 전체에서 절대값 / 상대값으로 표현 - 위의 방식에 따른 그리드의 위치 변화를 다르게.세로 / 가로 표현 - 데이터의 시각적 요소(예: 차트의 바, 라벨, 데이터 텍스트)에 마우스 호버시 포커스 - 데이터의 시각적 요소를 이용해 최소, 최대, 평균 과 같은 데이터를 재 시각화 / 툴팁박스 / 레전드에 표현 - 데이터 구간 선택시 구간에 대한 정보만 툴팁에 표시 ``` javascript const svg = ssh.create('svg') .attr({ height, width, viewbox: `0 0 ${ width } ${ height } ` }) const bar = ssh.group('name').create('rect').type('histogram') const line = ssh.group('name2').create('path').type('curve') const axis = svg.group('axis').axis({ x: ['cost', { visibility: 'hiddne' }], y: ['price', { color: 'red' }] }) const chart1 = svg.appendAll(bar) .data('legendTitle1', [{ x: 'A', y: 1 }, { x: 'C', y: 2 }]) .attr({ background: 'red' }) .animate({}) const chart2 = svg.appendAll(line) .data('legendTitle2', [{ x: 'B', y: 3 }, { x: 'A', y: 4 }]) const option = { grid: ['x'], data: 'relative', tooltip: [chart2], hover: { tooltipBox: { data: ['avg', 'max', 'min'], chart: [chart1, chart2] } }, click: { focus: { chart: [chart2] } } } // svg.toChart() ``` ## 진희 * 제작 방향 : 최소한의 설정으로 차트를 만든다. 문서가 없어도 사용가능할 정도로 직관적이고 일관성있게 만든다. * x축과 y축의 데이터 갯수는 일치해야한다. * 차트 옵션은 stacked, percentage가 있다. * 툴팁은 formatter를 이용하여 값을 전달받아 커스터마이징이 가능하다. * 레전드, 툴팁, 그리드 등의 스타일은 기본 스타일로 우선 제공한다. * 데이터 변경을 위한 함수 추가가 필요함. ``` xAxis = ['2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-06-05']; chartOptions = { title: { text: '판매량', }, series: [ { type: 'line || bar', legend: '사과', values: { x: xAxis, y: [10, 20, 30, 40, 10], }, }, { type: 'line || bar', legend: '바나나', values: { x: xAxis, y: [15, 25, 35, 45, 15], }, }, { type: 'line || bar', legend: '딸기', values: { x: xAxis, y: [1, 2, 3, 4, 1], }, }, ], axis: { x: { name: '과일의 종류', // 축 이름 }, y: { name: '판매개수', // 축 이름 labels: '{value}개', // 레이블 커스터마이징 }, }, options: { stack: true, percent: true, tooltip: { formatter: (value) => { return customValue; }, // 툴팁 커스터마이징 }, }, } chart.init(chartOptions); ``` ## 현 #### 차트 최소한의 설정으로 차트를 만들수 있어야하고 라이브러리를 사용하는 사용자가 쉽게 사용 할수 있어야 한다. 확장성을 고려하여 개발 #### 차트의 요구사항 javascript 및 svg 지원해야함 ie 9 이상 차트를 그릴 html DOM 필수 차트 유형 필수 입력 차트 속성 미입력시 default 로 적용 객체 형태로 데이터 전달 차트 데이터 형태 ``` data = [ { “date”: “10-01”, “population”: 240 }, { “date”: “10-02”, “population”: 550 }, { “date”: “10-03”, “population”: 950 } ] ``` #### 항목 value와 category를 설정 레전드, 툴팁, 그리드, default 스타일 변경은 chartOptions 를 객체 형태로 전달 #### 차트 유형 컬럼,라인 차트 #### 차트의 옵션 기능 format - 날짜, 숫자단위, 가격단위 legend - 범례 tooltip - 마우스 오버시 나오는 툴팁 박스 grid - 기본 라인 디자인 컬럼차트 - stacked 유형 라인차트 - curve, step, point ``` javascript chartOptions = { title: { text: ‘테스트’ }, series: [ { type: 'line', value: ‘population’, category: ‘date’, title: ‘text’, }, { type: 'bar', value: ‘other’, category: ‘item’, title: ‘text’ }, ], event: { legend: [ display: true, ], tooltip: [ display: true, ], cursor: [ display: true ] } } SSH(data, chartoptions); ``` ## 진희 ``` ## 작업 쪼개기 ### 축 * series 로 받은 데이터를 기준으로 x, y 축의 max 값을 계산한다. * x, y축을 만들고 레이블을 표시한다. * x 축에 따른 index 값 계산 ### 눈금과 눈금선 * x, y 값을 기준으로 적정한 간격을 계산한다. (적정한 간격의 정책 정의 필요) * 눈금, 눈금선을 표시한다. * 눈금선에 해당하는 축의 값을 표시한다. ### 차트 * 라인 * 데이터에 해당하는 값의 불릿 표시한다. * 데이터 간의 연결 션을 표시한다. * 바 * 데이터에 해당하는 값의 바를 표시한다. ### 옵션 만들기 * 스택 * 퍼센트 ### 액션 만들기 * 호버시 툴팁 * 호버시 그리드 * 데이터 변경 대응 ``` ``` javascript const data = [ { “date”: “10-01”, “population”: 240 }, { “date”: “10-01”, “population2”: 140 }, { “date”: “10-02”, “population”: 550 }, { “date”: “10-03”, “population”: 950 } ] const chartOptions = { title: { text: '판매량', }, series: [ { type: 'line || bar', value: ‘population’, category: ‘date’, }, { type: 'line || bar', value: ‘totalSales’, category: ‘date’, }, ], options: { event: { tooltip: [ display: true, // default false formatter: (value) => { return customValue; }, // 툴팁 커스터마이징 ], cursor: [ display: true // default false format: ['vertical', 'horizontal', 'cross'] ] }, // size: {width: 1500, height: 750}, 스크립트로 함수에 사이즈 가져옴 HTML으로 사이즈 정함 responsive: true, legend: true, subType: bar 이면 stack, line 이면 curve, stack, straight, percent: true, // 절대값/ 상대값 표시 }, } Chart.init(data, chartOptions) ```