Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset=utf-8>
- <title>Interactive Line Graph & Pie Chart</title>
- <style>
- body {margin:20px;}
- table {width:500px;border-collapse: collapse;}
- table td, table th {border:1px solid #888;text-align:center;}
- table th {background-color:#ddd;}
- </style>
- </head>
- <body>
- <table style="width:500px;">
- <colgroup>
- <col width="16%">
- <col width="14%">
- <col width="14%">
- <col width="14%">
- <col width="14%">
- <col width="14%">
- <col width="14%">
- </colgroup>
- <tbody>
- <tr id="row0" class="header">
- <th>부서</th>
- <th>1월</th>
- <th>2월</th>
- <th>3월</th>
- <th>4월</th>
- <th>5월</th>
- <th>6월</th>
- </tr>
- <tr id="row1" data-row="1" class="row">
- <td data-color="red">철강팀</td>
- <td>50</td>
- <td>40</td>
- <td>60</td>
- <td>10</td>
- <td>54</td>
- <td>65</td>
- </tr>
- <tr id="row2" data-row="2" class="row">
- <td data-color="green">섬유팀</td>
- <td>50</td>
- <td>60</td>
- <td>40</td>
- <td>90</td>
- <td>34</td>
- <td>70</td>
- </tr>
- <tr id="row3" data-row="3" class="row">
- <td data-color="blue">영업3팀</td>
- <td>20</td>
- <td>80</td>
- <td>90</td>
- <td>50</td>
- <td>64</td>
- <td>20</td>
- </tr>
- </tbody>
- </table>
- <p></p>
- <canvas id="graph" width="500" height="300"></canvas>
- <canvas id="pie" width="500" height="500"></canvas>
- <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.1.min.js"></script>
- <script>
- var graph, data;
- var xPadding = 30;
- var yPadding = 30;
- function getData(row){
- var cols = $("#row" + row).children("td");
- data = { values:[
- { X: "1월", Y: parseInt($(cols[1]).html()) },
- { X: "2월", Y: parseInt($(cols[2]).html()) },
- { X: "3월", Y: parseInt($(cols[3]).html()) },
- { X: "4월", Y: parseInt($(cols[4]).html()) },
- { X: "5월", Y: parseInt($(cols[5]).html()) },
- { X: "6월", Y: parseInt($(cols[6]).html()) },
- ]};
- }
- // Returns the max Y value in our data list
- function getMaxY() {
- var max = 0;
- for(var i = 0; i < data.values.length; i ++) {
- if(data.values[i].Y > max) {
- max = data.values[i].Y;
- }
- }
- max += 10 - max % 10;
- return max;
- }
- // Return the x pixel for a graph point
- function getXPixel(val) {
- return ((graph.width() - xPadding) / data.values.length) * val + (xPadding * 1.5);
- }
- // Return the y pixel for a graph point
- function getYPixel(val) {
- return graph.height() - (((graph.height() - yPadding) / getMaxY()) * val) - yPadding;
- }
- function drawChart(row){
- getData(row);
- graph = $('#graph');
- var c = graph[0].getContext('2d');
- c.clearRect(0, 0, graph[0].width, graph[0].height)
- c.lineWidth = 2;
- c.strokeStyle = '#333';
- c.font = 'italic 8pt sans-serif';
- c.textAlign = "center";
- // Draw the axises
- c.beginPath();
- c.moveTo(xPadding, 0);
- c.lineTo(xPadding, graph.height() - yPadding);
- c.lineTo(graph.width(), graph.height() - yPadding);
- c.stroke();
- // Draw the X value texts
- for(var i = 0; i < data.values.length; i ++) {
- c.fillText(data.values[i].X, getXPixel(i), graph.height() - yPadding + 20);
- }
- // Draw the Y value texts
- c.textAlign = "right"
- c.textBaseline = "middle";
- for(var i = 0; i < getMaxY(); i += 10) {
- c.fillText(i, xPadding - 10, getYPixel(i));
- }
- c.strokeStyle = '#f00';
- // Draw the line graph
- c.beginPath();
- c.moveTo(getXPixel(0), getYPixel(data.values[0].Y));
- for(var i = 1; i < data.values.length; i ++) {
- c.lineTo(getXPixel(i), getYPixel(data.values[i].Y));
- }
- c.stroke();
- // Draw the dots
- c.fillStyle = '#333';
- for(var i = 0; i < data.values.length; i ++) {
- c.beginPath();
- c.arc(getXPixel(i), getYPixel(data.values[i].Y), 4, 0, Math.PI * 2, true);
- c.fill();
- }
- }
- drawChart(1);
- $("table tbody td").hover(
- function(){
- $(this).parent("tr").children("td").css("background-color","yellow");
- var datarow = $(this).parent("tr").attr("data-row");
- drawChart(parseInt(datarow));
- },
- function(){
- $(this).parent("tr").children("td").css("background-color","white");
- }
- );
- $("#row0 th").click(function(){
- var idx = $(this).index();
- if( idx == 0 ) return;
- var month = $(this).text();
- var tds = $("table tr.row td:nth-of-type("+ (idx+1) +")");
- var tdvalues = [];
- for(var i=0; i<tds.length;i++) {
- var cdata = {};
- var team = $(tds[i]).parent("tr").children("td:eq(0)").text();
- var color = $(tds[i]).parent("tr").children("td:eq(0)").attr("data-color");
- cdata.team = team;
- cdata.color = color;
- cdata.sales = parseInt($(tds[i]).text(),10);
- tdvalues.push( cdata );
- }
- drawPie(tdvalues);
- });
- function drawPie(tdvalues) {
- var cc = document.getElementById("pie");
- var cctx = cc.getContext("2d");
- var x = cc.width; //그래프 넓이
- var y = cc.height; //그래프 높이
- var xc = x / 2; //가로 가운데 점
- var yc = x / 2; //세로 가운데 점
- var r = xc; // 반지름=정사각형이므로 가운데 점과 같음.
- var start = 0; //파이 시작 좌표
- var end = 0; //파이 끝 좌표
- var pi = 2 * Math.PI;
- var total = 0; //합계
- var colors = [];
- var teams = [];
- for( var i=0; i<tdvalues.length; i++ ) {
- total += tdvalues[i].sales;
- colors.push(tdvalues[i].color);
- teams.push(tdvalues[i].team);
- }
- for( var i=0; i<tdvalues.length; i++ ) {
- cctx.beginPath();
- cctx.moveTo(xc,yc);
- var percent = tdvalues[i].sales / total;
- end = start + (pi * percent);
- cctx.fillStyle = colors[i];
- cctx.arc(xc, yc, r, start, end);
- cctx.moveTo(xc, yc);
- cctx.fill();
- var ac = start + ( pi * (percent/2) );
- var pos = getTitlePosition(xc, yc, r/2, ac);
- cctx.fillStyle = "white";
- cctx.font = "20px Arial";
- cctx.textAlign = "center";
- cctx.fillText(teams[i], pos[0], pos[1]);
- start = end;
- }
- }
- function getTitlePosition(x, y, r, ac){
- var tx = x + Math.cos(ac) * r;
- var ty = y + Math.sin(ac) * r;
- return [tx, ty];
- }
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement