1. 구글차트 활용

구글차트 API 사이트 : https://developers.google.com/chart/

기본적인 차트 그리기

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
   <script type="text/javascript">
    google.charts.load('current', {'packages':['line']});
    google.charts.setOnLoadCallback(drawChart);

    function drawChart() {

      var data = new google.visualization.DataTable();
      data.addColumn('number', 'Day');
      data.addColumn('number', 'Guardians of the Galaxy');
      data.addColumn('number', 'The Avengers');
      data.addColumn('number', 'Transformers: Age of Extinction');

      data.addRows([
        [1,  37.8, 80.8, 41.8],
        [2,  30.9, 69.5, 32.4],
        [3,  25.4,   57, 25.7],
        [4,  11.7, 18.8, 10.5],
        [5,  11.9, 17.6, 10.4],
        [6,   8.8, 13.6,  7.7],
        [7,   7.6, 12.3,  9.6],
        [8,  12.3, 29.2, 10.6],
        [9,  16.9, 42.9, 14.8],
        [10, 12.8, 30.9, 11.6],
        [11,  5.3,  7.9,  4.7],
        [12,  6.6,  8.4,  5.2],
        [13,  4.8,  6.3,  3.6],
        [14,  4.2,  6.2,  3.4]
      ]);

      var options = {
        chart: {
          title: 'Box Office Earnings in First Two Weeks of Opening',
          subtitle: 'in millions of dollars (USD)'
        },
        width: 900,
        height: 500
      };

      var chart = new google.charts.Line(document.getElementById('linechart_material'));

      chart.draw(data, google.charts.Line.convertOptions(options));
     }
   </script>

각 Column에 데이터를 넣을수 있으며, 첫번째 Column은 그룹 레이블이며 String(이산그래프), number,date, datetime or timeofday(연속그래프) 타입을 넣을수 있다. 두번째 칼럼부터 실제 데이터를 넣는다. 옵션같은 경우는 구글차트 API 를 보고 적절하게 사용하며 된다.

2. 프로젝트 적용

이번에는 1주일동안 방문자수, 가입자수를 통계내는 그래프를 그리도록 하겠다.

  var today = new Date(); // 오늘 날짜
	var before = new Array(); // 이전 날짜 배열

	for(var i = 1 ; i < 7 ; i ++) { // 1주일전까지 날짜 구하기
		before[i] = new Date(today.getTime() - (i * 24 * 60 * 60 * 1000));
    // ex) before[1] = 1일전 , before[2] = 2일전
		before[i] = before[i].getDate() + '';
	}
	today = today.getDate() + ''; // 오늘 날짜에서 '일'만

	var userVisitCnt = new Array(7); // 방문자수 배열
	$.ajax({ // 배열에 방문자수 넣기
		type : 'post',
		url : '/admin/weekUserVisit',
		async: false,
		success : function(data) {
			for(var i in data) {
				userVisitCnt[i] = data[i];
			}
		}
	})

	var userRegCnt = new Array(7); // 회원가입수 배열

	$.ajax({ // 배열에 가입자수 넣기
		type : 'post',
		url : '/admin/weekUserReg',
		async: false,
		success : function(data) {
			for(var i in data) {
				userRegCnt[i] = data[i];
			}
		}
	})

	var max1 = 0; // 방문자수 최대
	var max2 = 0; // 가입자수 최대
	var weekUserVisit = 0; // 최신 1주일간 방문자 수
	for(var i = 0; i < 7; i++) { // 1주일간 방문자수 더하기
		weekUserVisit += userVisitCnt[i];
		if(max1 < userVisitCnt[i])
			max1 = userVisitCnt[i];
	}

	var weekUserReg = 0; // 최신 1주일간 방문자 수
	for(var i = 0; i < 7; i++) { // 1주일간 가입자수 더하기
		weekUserReg += userRegCnt[i];
		if(max2 < userRegCnt[i])
			max2 = userRegCnt[i];
	}

위에는 1주일간 데이터를 가져오는것이며, 아래는 실제 그래프 그리기이다.

  google.charts.load('current', {'packages': ['line']});
  google.charts.setOnLoadCallback(drawChart1);
  function drawChart1() {

	var data = new google.visualization.DataTable();
	data.addColumn('string', 'Day');
	data.addColumn('number', '방문자 수');
	data.addColumn('number', '회원가입 수');

	data.addRows([
		[before[6], userVisitCnt[6], userRegCnt[6]],
		[before[5], userVisitCnt[5], userRegCnt[5]],
		[before[4], userVisitCnt[4], userRegCnt[4]],
		[before[3], userVisitCnt[3], userRegCnt[3]],
		[before[2], userVisitCnt[2], userRegCnt[2]],
		[before[1], userVisitCnt[1], userRegCnt[1]],
		[today, userVisitCnt[0], userRegCnt[0]]
	]);

	var options = {
  		legend : {position: 'bottom'}, // 범례 위, 아래 지원 X
		chart: {
			title: '사용자 통계',
		subtitle: '일일 방문자 및 회원가입 수'
		},
		series: {
	        0: {targetAxisIndex: 0},
	        1: {targetAxisIndex: 1}
      	},
      	vAxes: {
			0: {viewWindow : {max : max1 + 4}},
			1: {viewWindow : {max : max2 + 4}}
		},
		vAxis:{
			gridlines: {count: 0},

		},
		hAxis: {
			gridlines: {count: 2}
		},
		colors: ['#620017','#0066ff'],
	};

	var chart = new google.charts.Line(document.getElementById('chart1'));

	chart.draw(data, google.charts.Line.convertOptions(options));

첫번째칼럼에 날짜임에 불구 하구 String 을 넣는 이유는 연속그래프의 경우 1일 2일 3일 정확히 떨어지는게 아니라 시간까지 계산을 해버리기 때문에 각각 날짜에 따른 방문자수는 맞는지않는다. 그래서 직접 1일전 2일전, 3일전을 계산해서 넣었다.

serise는 차트선을 2개 그릴때 쓰는것이며, 0 : 방문자 그래프, 1 : 가입자수 그래프이다. 또한 가이드라인이 지저분하게 그려지기 때문에 0으로 아예 지웠으며, viewWindow 경우 4미만의 값들은 소숫점이 나오기때문에 0의 값이여도 최대값 4를 주기 위해서 넣었다.

chanhee.kim's profile image

chanhee.kim

2017-12-11 11:03

Read more posts by this author