まいける's Tech Blog

LAMP関係のメモなどを不定期に掲載します

PEAR Image_Graph 覚え書き

 このところ、仕事で PEAR の Image_Graph を使う機会が多かったので、覚え書き。

 今回やりたかったことは、

  • DBとの連携
  • ランキングレポートのように、Y軸の上にいくに従って値が小さくなる
  • グラフをファイルとして出力する
  • グラフに背景を入れる
  • グラフの線にアンチエイリアスをかける
  • マーカーを付ける
  • グリッド線を入れる

といったあたり。

<?php
require_once 'Image/Graph.php';
require_once 'Image/Canvas.php';

// アンチエイリアスの設定(ただし、バンドル版のGDライブラリを使用していないと使えない)
$Canvas =& Image_Canvas::factory('png', array( 'width'=>640, 'height'=>480, 'antialias' => 'native' ) );

$Graph =& Image_Graph::factory('graph', $Canvas );

// TrueType フォントの設定(うまくいかなかった)
// $Font =& $Graph->addNew('font', 'Verdana');
// フォントサイズを 8 ピクセルに設定
// $Font->setSize(8);
// $Graph->setFont($Font);


// プロットエリアと凡例の設定
$Graph->add(
	Image_Graph::vertical(
		$Plotarea = Image_Graph::factory('plotarea'),
		$Legend = Image_Graph::factory('legend'),
		95 // プロットエリアと凡例の割合を 95:5 に設定
	)
);
	
$Legend->setPlotarea( $Plotarea );

// データセットを2つ用意
$Datasets["A"] =& Image_Graph::factory('dataset');
$Datasets["B"] =& Image_Graph::factory('dataset');

//
// このあたりでデータベースの処理
//
	
while ( $row = $res->fetchRow() ) {
	
	$Datasets["A"]->addPoint( $row["date"], $row["a"] );
	$Datasets["B"]->addPoint( $row["date"], $row["b"] );
	
}

// 線の太さの設定
$Line1 =& Image_Graph::factory("Image_Graph_Line_Solid", "red");
$Line1->setThickness(1);

$Line2 =& Image_Graph::factory("Image_Graph_Line_Solid", "blue");
$Line2->setThickness(1);
	
// マーカーの設定
$Marker1 =& Image_Graph::factory('Image_Graph_Marker_Box');
$Marker1->setSize(2);
$Marker1->setLineColor('red');
$Marker1->setFillColor('red');

$Marker2 =& Image_Graph::factory('Image_Graph_Marker_Diamond');
$Marker2->setSize(3);
$Marker2->setLineColor('blue');
$Marker2->setFillColor('blue');
	
$Plot1 =& $Plotarea->addNew('line', array(&$Datasets["A"]));
$Plot1->setLineStyle( $Line1 );
$Plot1->setMarker( $Marker1 );
$Plot1->setTitle('A');

$Plot2 =& $Plotarea->addNew('line', array(&$Datasets["B"]));
$Plot2->setLineStyle( $Line2 );
$Plot2->setMarker( $Marker2 );
$Plot2->setTitle('B');

// Y軸の設定
$AxisY =& $Plotarea->getAxis('y');
$AxisY->setInverted(true); // 上が最小値となるように設定
$AxisY->setTitle('Rank', 'vertical');
$AxisY->forceMaximum(500); // Y軸の最大値を設定

// X軸の設定
$AxisX =& $Plotarea->getAxis('x');
$AxisX->setAxisIntersection('max'); // Y軸とY軸の最大値で交わるように設定
$AxisX->setTitle('Date');

// グリッドの設定
$GridX =& $Plotarea->addNew('line_grid', null, IMAGE_GRAPH_AXIS_X);
$GridX->setLineColor('gray@0.5'); 

$GridY =& $Plotarea->addNew('line_grid', null, IMAGE_GRAPH_AXIS_Y);
$GridY->setLineColor('gray@0.5'); 

// プロットエリアのパディング
$Plotarea->setAxisPadding(20, 'left');
$Plotarea->setAxisPadding(20, 'right');

// グラフ全体の背景に画像を合成する設定(使用できるのは JPEG 画像)
$Graph->setBackGround(Image_Graph::factory('Image_Graph_Fill_Image','/foo/bar/graph-bg.jpg'));

// プロット領域を塗りつぶしておく
$Plot1->setBackGroundColor('white');

// 出力するファイル名の指定
	
$filename = '/foo/bar/graph/test.png';

// グラフの出力
$Graph->done(
	array(
		'filename' => $filename,
	)
);
?>