기술빙자사기

PHP 의 pear 패키지를 이용한 그래프,차트 이미지 생성

권성재 2009. 4. 1. 12:04
사용자 삽입 이미지
################################################################# ## 쓴이 : 카폐인 ( nonots@hanmail.net ) ## 쓴때 : 2009-03-31 오후 ## 소속 : 바다웹호스팅 http://www.badaweb.co.kr ## 제목 : PHP 의 pear 패키지를 이용한 그래프,차트 이미지 생성 ################################################################# 1. 개요 다들 아시는 내용일지 몰라도, 내딴에는 제법 쓸모가 있어서 간략하게 올립니다. php 하면서 그래프와 차트를 보기좋게(!) 만들어야 할 때가 있습니다. 단순한 고객일수록 프로그램 기능은 둘째고, 요란한 화면 출력에 우선 이목이 집중되니까요.. .. 아래 내용은 pear.php.net 에 있는 pear 패키지중 Image_Graph 라는 걸로 GD 라이브러리 이용해서 그래프를 생성하는 방법입니다. 그런데 아직 알파 버전이고..2006 년 이후로 업데이트도 안됩니다. 그렇다고 문제가 있다기 보다는.. 더이상 보완하거나 큰문제가 없어서 그냥 방치한거 같은데.. 암튼.. 써보니 충분히 이용할 만 합니다. 일단 GPL 이니까 사용에 제한이 없고, 트루타입 폰트로 한글 표현에 자유롭습니다. 매뉴얼 : http://pear.veggerby.dk/documentation/ 샘플 사이트 : http://pear.veggerby.dk/samples/ (샘플사이트 샘플그래프에 php 소스도 같이 있다) 2. 미리 할 일 - 테스트 서버 환경 : 리눅스 CentOS 5.2 , apache 2.0, PHP 5.2.6 - 홈디렉토리 : /var/www/html - 작업디렉토리 : /var/www/html/graph - PEAR 설치위치 : /usr/local/php/lib/php/ - 경로 :
http://내서버주소/graph/ko.php 1) PEAR 의 Image_Graph 패키지 설치 위에서 말했듯이 패키지가 알파버전이라서 일반적으로 pear install Image_Graph 명령으로 설치가 안된다. 그래서 패키지명 뒤에 alpha 를 붙여서 실행한다. 그런데 의존성있는 패키지가 여러개 있어서 --alldeps 옵션을 추가해야한다. Image_Canvas 등 몇개 더 설치된다. [root@home4 ~]# pear install --alldeps Image_Graph-alpha pear.php.net" to update downloading Image_Graph-0.7.2.tgz ... Starting to download Image_Graph-0.7.2.tgz (368,056 bytes) ........................................................................done: 368,056 bytes downloading Image_Canvas-0.3.1.tgz ... Starting to download Image_Canvas-0.3.1.tgz (46,329 bytes) ...done: 46,329 bytes downloading Numbers_Roman-1.0.2.tgz ... Starting to download Numbers_Roman-1.0.2.tgz (6,210 bytes) ...done: 6,210 bytes downloading Numbers_Words-0.16.1.tgz ... Starting to download Numbers_Words-0.16.1.tgz (52,503 bytes) ...done: 52,503 bytes downloading Image_Color-1.0.3.tgz ... Starting to download Image_Color-1.0.3.tgz (9,234 bytes) ...done: 9,234 bytes install ok: channel://pear.php.net/Numbers_Roman-1.0.2 install ok: channel://pear.php.net/Numbers_Words-0.16.1 install ok: channel://pear.php.net/Image_Color-1.0.3 install ok: channel://pear.php.net/Image_Canvas-0.3.1 install ok: channel://pear.php.net/Image_Graph-0.7.2 [root@home4 ~]# 테스트서버의 경우 pear 가 /usr/local/php/lib/php 에 있으므로 설치한파일은 /usr/local/php/lib/php/Image/Graph /usr/local/php/lib/php/Image/Canvas 등에 위치하게된다. pear 설치위치는 컴파일옵션에 따라 서버마다 다를수 있다. 2) 한글위해 트루타입 폰트 설치 리눅스 설치시 백묵 등 기본으로 설치가 되어 있으면 따로 설치할 필요는 없다. 요즘 네이버나 다음.. 등에서 배포하는 보기좋은 트루타입폰트파일 하나만 있으면 된다. 확장자자 *.ttf 등으로 된거다 리눅스 기본폰트는 centos4.x 에서는 ttffonts-ko , cenos5.x 에서는 fonts-korean 이라는 rpm 패키지 명으로 있다. 설치가 안되어 있으면 yum 등으로 설치한다. 이걸 설치하지 않고 다음이나 네이버 폰트를 사용하려면 그럴 사용해도 된다. /usr/share/fonts/ko 혹은 /usr/share/fonts/korean 디렉토리 아래 찾아보고 gulim.ttf , batang.ttf 이런 파일을 위 작업디렉토리로 복사한다. 내 경우 /var/www/html/graph/gulim.ttf 로 복사했다. .. 그런후 pear 디렉토리 하위에 있는 /usr/local/php/lib/php/Image/Canvas/Fonts/fontmap.txt 라는 파일을 제일아래에 Gulim,gulim.ttf 라고 한줄 추가한다. 만약 트루타입폰트가 nanum.ttf 라면 Nanum,nanum.ttf 라고 추가 하면 된다. 이렇게 해야 pear 패키지에서 gulim.ttf 폰트에 대한 별명으로 Gulim 이라는 걸 php 소스에서 사용할 수 있게 된다. 만약 서버의 경로 그대로 사용하려면 아래와 같이 한다. Batang,/usr/share/fonts/korean/TrueType/batang.ttf 이렇게 서버 폰트 경로 그대로 사용하면 ttf 파일을 복사할 필요 없다. .. 이제 다 됐다.. 3. 샘플 파일 만들기 /var/www/html/graph/ko.php 파일을 생성해 보겠다. 주석을 참고해서 아래 부분을 복사해서 테스트 하면 된다. ko.php 파일 시작 <?php /** * Usage example for Image_Graph. * * Main purpose: * Show dot/scatter chart * * Other: * None specific * * $Id: plot_scatter_linefit.php,v 1.1 2005/09/14 20:27:25 nosey Exp $ * * @package Image_Graph * @author Jesper Veggerby <pear.nosey@veggerby.dk> */ require_once 'Image/Graph.php'; // 그래프 크기 500,300 으로 생성 $Graph =& Image_Graph::factory('graph', array(500, 300)); // 굴림폰트 추가, gulim.ttf 파일을 읽어오도록 fontmap.txt 에서 지정 //$Font =& $Graph->addNew('font', 'Batang'); $Font =& $Graph->addNew('font', 'Gulim'); // 폰트 사이즈를 10 으로 지정 $Font->setSize(10); $Graph->setFont($Font); // 한글처리는 유니코드로 하므로 완성형의 경우 iconv 함수로 변환한다. $title = iconv('euc-kr','utf-8','## 느티나무 : 점그래프 샘플 ##'); $Graph->add( Image_Graph::vertical( Image_Graph::factory('title', array($title, 12)), Image_Graph::vertical( $Plotarea = Image_Graph::factory('plotarea'), $Legend = Image_Graph::factory('legend'), 90 ), 6 ) ); // 그래프 아래 출력여부, 필요없으면 주석처리하면 됨 $Legend->setPlotarea($Plotarea); // 데이타셋을 지정한다. 랜덤으로 해줄수도 있고. // 직접 addPoint 메소드로 지정할 수 있다. // 랜덤은 12 개를 70에서 130 사이의 임의의 값으로 생성한다. $Dataset1 =& Image_Graph::factory('random', array(12, 70, 130, false)); /* $Dataset1 =& Image_Graph::factory('dataset'); $Dataset1->addPoint(iconv('euc-kr','utf-8','1월'), 97); $Dataset1->addPoint(iconv('euc-kr','utf-8','2월'), 103); $Dataset1->addPoint(iconv('euc-kr','utf-8','3월'), 80); $Dataset1->addPoint(iconv('euc-kr','utf-8','4월'), 83.0); $Dataset1->addPoint(iconv('euc-kr','utf-8','5월'), 68); $Dataset1->addPoint(iconv('euc-kr','utf-8','6월'), 95); $Dataset1->addPoint(iconv('euc-kr','utf-8','7월'), 99); $Dataset1->addPoint(iconv('euc-kr','utf-8','8월'), 91); $Dataset1->addPoint(iconv('euc-kr','utf-8','9월'), 90); $Dataset1->addPoint(iconv('euc-kr','utf-8','10월'), 100); $Dataset1->addPoint(iconv('euc-kr','utf-8','11월'), 120); $Dataset1->addPoint(iconv('euc-kr','utf-8','12월'), 90); */ // 그래프 생성 // area,line 등 여러가지 타입으로 생성가능하다. $Plot1 =& $Plotarea->addNew('area', array(&$Dataset1)); $Plot1->setFillColor('blue@0.2'); // 데이타 라인 그리드, 필요 없으면 주석 $Grid =& $Plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); $Grid->setLineColor('silver'); // 그래프 각 값의 마크 형태를 지정해서 색깔 등 지정 //$Marker1 =& Image_Graph::factory('Image_Graph_Marker_Diamond'); $Marker1 =& Image_Graph::factory('Image_Graph_Marker_Cross'); $Marker1->setFillColor('blue'); $Marker1->setLineColor('black'); // set a line color $Plot1->setMarker($Marker1); $Plot1->setTitle(iconv('euc-kr','utf-8','기간별 변동정보')); // 가로 일직선, 100 값을 기준선, 기준선이 필요없으면 주석처리 $Plot2 =& $Plotarea->addNew('Image_Graph_Axis_Marker_Line', null, IMAGE_GRAPH_AXIS_Y); $Plot2->setLineColor('red'); $Plot2->setValue(100); // 가로 세로 축 설명글, $AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X); $AxisX->setTitle(iconv('euc-kr','utf-8','월별정보')); $AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); $AxisY->setTitle(iconv('euc-kr','utf-8','변동값'), 'vertical'); // output the Graph $Graph->done(); // 만약 출력을 파일로 저장할때 //$Graph->done( array('filename'=>'./aaa.png')); ?> ko.php 파일 끝 4. 마무리 이 소스의 결과는 http://home7.bada.cc/graph/ko.php 에서 볼 수 있고, 더 화려한 차트는 샘플 사이트 : http://pear.veggerby.dk/samples/ 에서 참조 가능합니다. 샘플 php 소스도 같이 있으므로 쉽게 수정해서 사용할 수 있습니다.