perl Makefile.PL make make install(물론 root로)대부분의 모듈들은 이 순서로만 하면 거의 한큐에 설치가 된다. 제대로 설치가 되었는지를 확인하려면,
make samples한 후에 samples 디렉토리로 들어가서 sample*.png 나 sample*.gif 파일을 그래픽 뷰어로 확인해 보면 된다. 이때 GD::Graph 모듈을 컴파일 하기 전에 버전 1.19 이상의 GD 라이브러리가 설치 되어 있어야 하며 GD::Text::Align 모듈도 설치 되어 있어야 한다. 그냥 간단하게 자동 설치 프로그램들을 이용해서 설치하는 것이 속 편할 듯 싶다..-_-;;
apt-get install libgd-perl-graph라는 명령어로 한큐에 설치가 된다. 죄송하지만 레드햇은 써 본지가 5년이 넘어서 잘 모르겠다..;;
@data = ( ["1st","2nd","3rd","4th","5th","6th","7th", "8th", "9th"], [ 1, 2, 5, 6, 3, 1.5, 1, 3, 4], [ sort { $a <=> $b } (1, 2, 5, 6, 3, 1.5, 1, 3, 4) ] );또는
@x_label = { "1st","2nd","3rd","4th","5th","6th","7th", "8th", "9th"}; @x_value_1 = { 1, 2, 5, 6, 3, 1.5, 1, 3, 4}; @x_value_2 = { sort { $a <=> $b } (1, 2, 5, 6, 3, 1.5, 1, 3, 4) } ... @data = ( \@x_label, \@x_value_1, \@x_value_2, ... )이렇게 배열의 배열로 x 축 데이터를 만들어 내는데, 첫번째 인자는 x 축의 눈금들에 붙여질 이름이나 수치들의 배열이고, 두 번째부터는 그래프를 그리는 데 이용하는 x 값들의 배열들을 나열하면 된다. 사실 데이터 타입을 정확히 말하자면 배열의 레퍼런스들을 저장해 놓은 배열인 것이므로, 데이터 배열 안에 배열을 직접 저장하는 일은 없기를 바란다. (필자도 말이 꼬이고 있다..-_-;;)
$graph = GD::Graph::chart->new(400, 300);위의 chart 라는 키워드 대신 lines, bars, points, linespoints, area, mixed, pie도 쓸 수 있다. 행여나 "chart"라는 단어를 쓰는 독자분은 아무도 없으리라고 생각한다.(사실 필자가 그짓을 했었다..-_-;;)
$graph->set( x_label => "X Label", # X 축의 라벨 이름을 붙인다. y_label => "Y label", # Y 축의 라벨 이름을 붙인다. title => "Simple Graph", # 그래프의 타이틀을 지정해준다. y_max_value => 8, # y 축의 최대 값을 지정한다. y_tick_number => 8, # y 축의 눈금을 몇개로 나눌 것인가를 지정한다. y_label_skip => 2 # y 축 눈금에 붙이는 값들을 몇개마다 붙일 것인가를 지정해준다. );조금 설명이 애매하지만, 그래프를 그리고 출력해보면 바로 알 수 있을 것이다. 그리고 바로 그래프를 그리면 된다.
my $gd = $graph->plot(\@data); # 데이터 셋 역시 레퍼런스로 넘겨준다.생성된 그래프 데이터를 파일로 저장하는 방법은 GD 라이브러리의 버전에 따라서 조금씩 다르다. 1.19 이전의 GD 라이브러리를 쓴다면
open(IMG, ">file.gif") or die $!; binmode IMG; print IMG $gd->gif; close IMG;위와 같이 하고, 1.20 이상의 최신 버전을 사용한다면
open(IMG, ">file.png") or die $!; binmode IMG; print IMG $gd->png; close IMG;또는 다음과 같이 사용하면 된다.
open(IMG, ">file.gd2") or die $!; binmode IMG; print IMG $gd->gd2;물론 다음과 같은 축약형의 사용 방법도 존재한다.(각각의 경우 GD 라이브러리가 지원하는 함수를 사용한다.)
print IMG $graph->plot(\@data)->gif; print IMG $graph->plot(\@data)->png; print IMG $graph->plot(\@data)->gd; print IMG $graph->plot(\@data)->gd2;CGI 스크립트에서 쓰려면 다음과 같이 하면 된다.
use CGI qw(:standard); ... print header("image/png"); binmode STDOUT; print $graph->plot(\@data)->png;4. GD::Graph 모듈의 실제 적용 예
[그림] 시스템 신뢰도에 대한 시뮬레이션 결과를 웹상에서 그래프로 나타낸 그림
---- graph.html -------- graph.cgi ---- #!/usr/bin/perl -w use CGI; # CGI 모듈 사용 use GD::Graph::lines; # 문제의 GD::Graph 모듈 사용 # lines 부분을 다음과 같은 키워드로 대체하면 # lines, bars, points, linespoints, area, mixed, pie # 그 모듈 형식의 그래프를 그릴 수 있음 $q = new CGI; # CGI 객체를 생성 $first = $q->param("first"); # 첫번째 신뢰도 확률식을 저장 $second = $q->param("second"); # 두번째 신뢰도 확률식을 저장 @x_label = (); # x 축의 라벨값들을 저장하는 리스트 @f_value = (); # 첫번째 신뢰도 확률식에 확률을 대입한 신뢰도 값들을 # 저장 할 변수를 초기화 @s_value = (); # 두번째 신뢰도 확률식에 확률을 대입한 신뢰도 값들을 # 저장 할 변수를 초기화 $first =~ s/\^/**/g; # 확률식에서 누승 연산자인 ^ 를 펄이 인식할 수 있는 $second =~ s/\^/**/g; # ** 연산자로 바꿔준다 # 아래는 0 부터 1 까지 0.1 씩 증가하는 확률 값들을 확률식에 대입하여 # 신뢰도를 계산 한 후 그 식을 직접 eval 함수로 계산한 후에 # 각각의 신뢰도 배열에 저장한다 for ($i = 0; $i <= 1; $i += 0.1) { push(@x_label, $i); $temp = $first; $temp =~ s/p/$i/g; # p 라고 되어 있는 부분을 확률값으로 치환 $fv = eval($temp); # eval 함수를 이용하여 확률식을 직접 계산 push(@f_value, $fv); $temp = $second; $temp =~ s/p/$i/g; $sv = eval($temp); push(@s_value, $sv); push(@fs_value, $fv - $sv); # 세번째 그래프로 첫번째 확률식의 신뢰도와 # 두번째 시스템 확률식의 신뢰도의 차이를 # 다른 그래프 하나도 표시하기 위함 } # 그래프를 그리기 위한 데이터 리스트 # 이 리스트에는 x 축의 라벨 값들과 # 그 다음 그리고자 하는 그래프 값들을 가진 배열를의 레퍼런스들의 # 리스트를 가진다. 즉 그래프의 갯수는 넘겨주는 인수의 갯수 -1 @data = (\@x_label, \@f_value, \@s_value, \@fs_value); # 그래프를 그릴 영역을 400x300 으로 만든다 $graph = GD::Graph::lines->new(400, 300); $graph->set( y_label => "Reliability", # y 축의 이름 x_label => "Probability", # x 축의 이름 title => "System Reliability", # 그래프의 제목 y_min_value => 0, # y 축의 시작 값 y_max_value => 1, # y 축의 최대값 y_tick_number => 10, # y 축의 눈금을 몇개로 나눌 것인가 y_label_skip => 1, # y 축에 붙이는 라벨을 눈금 몇개마다 하나씩 붙일 것인가 ); my $gd = $graph->plot(\@data); # 그래프를 생성해서 gd 에 저장 print $q->header("image/gif"); # gif 파일을 전송한다고 알려줌 binmode STDOUT; # 출력 모드를 바이너리로 바꾸고 print STDOUT $gd->png; # gd 에 저장되어 있는 그림 파일을 표준출력으로 출력 close STDOUT; 5. 더 해야 할 것...Chapter 1 ---- graphh.html ----
이전 글 : 더욱 개선된 PyKDE2
다음 글 : 인사이드 iPhoto: 파워슈터를 위한 이미지 관리
최신 콘텐츠