PHP & Others

mysql + GD를 이용한 통계용그래프

페이지 정보

본문

http://myhome.naver.com/cinuae/images/graph.html




그냥 만들었습니다. ㅡㅡ;

색에 둔해서 좀 촌시려 보이는데요. 감각있는 분이 색갈좀 지정해주시면 꾸며보겠습당.
보내실 곳은 네이버이고 아이디는 위에 이미지 링크보면 제 아이디 아시겠죠.
스펨메일때문에 게시판에 메일주소를 직접 쓰기가 무섭슴당.
문제도 몇가지 있습니다.
그라디에이션 효과에서 이미지 사이즈가 커지커나, 많은 처리를 요구하게 되면 안되더군요.
그래서 막대를 그라디에이션 효과 안했습니다.
한글도 또렷이 안써지는 문제도 있고요.
Ver 1.8x 에서 했는데 좀더 심하더군요.
Ver 2.x 에서는 한글이 좀 선명하구요.
폰트파일은 win2000에 있는 것들입니다. 폰트파일 바꾸면 글자 크기에 따른
수정도 필요할겁니다.
--------------------------------------------------------------------------------
<?
//몇개의 결과를 보여줄것인가를 나타내는 변수, 많을 수록 이미지 width가 길어짐, 쿼리에서 limit에 쓰인다.
//여기서는 월,화,수,목,금,토,일 7개가 나온다.
$limit=7;
//이미지 width, 출력되는 결과에 따라 자동 증가
//좌우측여백(50 * 2) + $limit * 50 + 20(카피라이트) => 이미지가로
$x=$limit*50+100;
//이미지 height, 늘리고 싶다면 100 단위로 늘릴것을 권장함(좌측 수치의 위치문제때문)
$y=300;
//하단컬럼제목 쓰기(공간이 50px로 한글세자가 적당)
$arr_column=array("월요일","화요일","수요일","목","금","토","일","Total","Average");
//그래프 타이틀 작성
$title="여기는 그래프 제목";
//DB 자료불러오기
//결과값중 MAX값,쿼리를 한번 더 사용해 미리 출력값 중 MAX값을 지정해야함
//$max를 100%로 하고 상대적 위치를 표시한다.
//$sql="select max(...) from TABLE where ~~ group ~~ 이런 쿼리겠죠
//여기에선 일단 1000이 최고 값
$max=1000;
$db=mysql_connect("test","test","test");
mysql_select_db("test",$db);
//$start에서 $limit개 각각에 맞게 설정하세요.
$start=10;
$sql="select kor,eng,mat,name from test limit $start,$limit";
$result=mysql_query($sql,$db);
//이미지생성
$im = imagecreate($x+20,$y);
//색을지정함
$back = imagecolorallocate($im, 0, 0, 0);//검은색
$white = imagecolorallocate($im, 255,255,255);//흰색
$gray = imagecolorallocate($im, 200, 200, 200);//사각형막대바의 테두리색
$light_blue = imagecolorallocate($im,30,131,191);//가로줄, 세로줄의 색
$red = imagecolorallocate($im,181,0,0);//적색막대
$blue = imagecolorallocate($im,0,0,181);//청색막대
$green = imagecolorallocate($im,0,181,0);//녹색막대
$yellow = imagecolorallocate($im,255,255,172);//노란색 컬럼제목
//이미지바탕은 검은색
imagefill($im, 0, 0, $back);
//배경의 그라디에이션효과(잘보면 배경의 파랑색이 그라디에이션효과입니다 ㅡㅡ;
//길이가 길어지면 나타나는효과가 이상해짐(버그인듯), $y 값에 따라 수동조절이 필요할 수 있음
//($im, 0, 0, 155*$i/$y+100)이 부분 수치 조절을 잘하면 효과가 잘나오는데
//색에 감각이 없어서. 성공하면 올려주세요.
for ($i = $y; $i >= 0; $i--){
//$el_color = imagecolorallocate($im, 155*$i/$y+100, 0, 0);//빨강배경
$el_color = imagecolorallocate($im, 0, 0, 155*$i/$y+100);//파랑배경
imageline($im,0,$y-$i,$x,$y-$i,$el_color);
}

//가로줄
for($i=50;$i<=$y-50;$i=$i+10){
imageline($im,50-5,$i,$x-45,$i,$light_blue);
}

//세로줄
for($i=50;$i<=$x-50;$i=$i+50){
imageline($im,$i,50-5,$i,$y-45,$light_blue);
}

//세가지 막대를 그리는 함수
//막대는 하나 혹은 두개만 그릴 수도 있음, 아래에서 주석처리하면됨
function fx($x1,$y,$y1,$y2,$y3){
global $im,$red,$blue,$green,$gray,$white;
//적색막대
imagefilledrectangle($im,$x1,$y1,$x1+10,$y-51,$red);
//적색막대를 쌓고 있는 회색태두리
imagerectangle($im,$x1,$y1,$x1+10,$y-51,$gray);
//청색막대
imagefilledrectangle($im,$x1+10,$y2,$x1+20,$y-51,$blue);
//청색막대를 쌓고 있는 회색태두리
imagerectangle($im,$x1+10,$y2,$x1+20,$y-51,$gray);
//녹색막대
imagefilledrectangle($im,$x1+20,$y3,$x1+30,$y-51,$green);
//녹색막대를 쌓고 있는 회색태두리
imagerectangle($im,$x1+20,$y3,$x1+30,$y-51,$gray);
}

//DB 자료불러오기
$i=0;//루프증가 체크용변수
while($rows=mysql_fetch_array($result)){
//그래프의 Y축 높이를 계산해서 함수에 넘긴다
$y1=$y-50-($y-100)*$rows[kor]/$max;
$y2=$y-50-($y-100)*$rows[eng]/$max;
$y3=$y-50-($y-100)*$rows[mat]/$max;
//하단컬럼제목 쓰기(디비에 없다면 아래 배열에서 표시해도된다)
//컬럼제목의 X축위치, 문자열의 픽셀을 구해 가운데 정렬을 한다
$xe=$i*50+50;//시작점은 50에서 50씩 커진다
fx($i*50+60,$y,$y1,$y2,$y3);
$i++;
}

//하단컬럼제목 쓰기(공간이 50px로 한글세자가 적당)
for( $i = 0 ; $i < $limit ; $i++ ){
//컬럼제목의 X축위치, 문자열의 픽셀을 구해 가운데 정렬을 한다
//시작점은 50에서 50씩 커진다
$xe=$i*50+50;
//한글사용을 위해
$str=iconv("EUC-KR","UTF-8",$arr_column[$i]);
//쓰여질 글자의 크기(픽셀)를 구하기 위한 함수
$arr_size=imagettfbbox(9,0,"/WebHosting/font/H2GTRM.TTF",$str);
//글자의 width값
$width=abs($arr_size[2]-$arr_size[0]);
//나누고 쪼개서 가운데 좌표를 구함
$xe=$xe+round((50-$width)/2);
//쓰기
imagettftext($im,9,0,$xe,$y-35,$yellow,"/WebHosting/font/H2GTRM.TTF",$str);//쓰기
}

//좌측 수치 나타내기($MAX에서 0까지),글자를 그래프에 붙여서 정렬하기 위해 좀 복잡
for($i=0;$i<=10;$i++){
//Y축의 시작점
$ye=54+$i*(($y-100)/10);
//표시할 값
$maxe=$max-$max*$i/10;
//길이구하는함수
$arr_size2=imagettfbbox(7,0,"/WebHosting/font/H2GTRM.TTF",$maxe);
//글자의 width
$width=abs($arr_size2[2]-$arr_size2[0]);
//시작할 X축의 위치
$xe=40-$width;
//쓰기
imagettftext($im,7,0,$xe,$ye,$white,"/WebHosting/font/H2GTRM.TTF",$maxe);
}

//그래프 타이틀 작성
//한글사용을 위해
$title=iconv("EUC-KR","UTF-8",$title);
//길이구하는함수
$arr_size3=imagettfbbox(7,0,"/WebHosting/font/H2SA1M.TTF",$title);
//글자의 width값
$width=abs($arr_size3[2]-$arr_size3[0]);
//중앙정렬
$xe=round(($x-$width)/2-20);
//쓰기
imagettftext($im,14,0,$xe,20,$yellow,"/WebHosting/font/H2SA1M.TTF",$title);

//카피라이트
//여긴 고유권한이지만 수정하겠다면 말리지못하죠
$coypright="Copyright 2004 CINUAE All rights reserved.";
imagettftext($im,8,90,$x+12,round(($y-250)/2+250),$white,"/WebHosting/font/H2GTRM.TTF",$coypright);

header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

 

관련자료

등록된 댓글이 없습니다.
Today's proverb
사람의 과실은 흔히 언어에서 나오는 것이니 말은 반드시 정성스럽고 미덥게 시기에 맞춰 진실되게 하여야 한다. (이율곡)