#################################################################
## 쓴이 : 카폐인 ( 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 소스도 같이 있으므로 쉽게 수정해서
사용할 수 있습니다.