purazumakoiの[はてなブログ]

技術メモから最近はライフログも増えてきてます。

Image_Graphで円グラフ作ってみた。

PHPでグラフをつくるということで、作ってみた。

ググってみたけど、あんまりサンプルないし、日本語のマニュアルないので(有っても理解できないかもしれないけど・・・

なんかPEARでそういうライブラリがあったのでそれでやってみます。
  • 外部ファイルとして置くのでファイルをDL

http://download.pear.php.net/package/Image_Graph-0.7.2.tgz
http://download.pear.php.net/package/Image_Canvas-0.3.0.tgz
http://download.pear.php.net/package/Image_Color-1.0.2.tgz
それらのおき場所とかは、こちらを参考


ちょいちょい試してる人がいたのでそれらのコードを参考にして作ってみた。
値はDBからとってます。


まずは作ったグラフを表示を引っ張ってくるHTML。imgタグでグラフ書いてるphpを呼び出します。
こんなかんじ

<body>
	<img src="pear_graph.php" />
</body>

次は肝心のPHP部分

<?php
 require_once('Image/Graph.php');
/* ----DB関係(ADOdbでデータ抽出)------------*/

$db = NewADOConnection(DB_TYPE);
$db->pconnect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if(!$db) die("エラー: データベース接続に失敗しました。");
$result = $db->execute("select * from table_name");
if(!$result) die("エラー: " . $db->ErrorMsg());
$count = $result->RecordCount();


$menuAry = array(
 "1" => 0,
 "2" => 0,
 "3" => 0
);

// DBから値とってきて配列にいれてます。
for($i = 0; $i < $count; $i++) {
 $ary = $result->FetchRow();
 
 switch ($ary['page_id']) {
  case 1:
   $menuAry[1] += $ary['pageview'];
   break;
  case 2:
   $menuAry[2] += $ary['pageview'];
   break;
  case 3:
   $menuAry[3] += $ary['pageview'];
   break;
  default:
   break;
 }
}

$db->close();
/*-----------------------------------------------*/


// ここからがグラフ作るところ!
// キャンパスを作る(500×400)
$Graph =& Image_Graph::factory('graph', array(500, 400));

// フォント関係はphpコンパイル時ののモジュールが足りなくて出来ませんでした。

$Graph->add(
 Image_Graph::vertical(
 // タイトル
 Image_Graph::factory('title', array('test', 10)),
 Image_Graph::horizontal(
   $Plotarea = Image_Graph::factory('plotarea'),
   $Legend = Image_Graph::factory('legend'),
   100 //グラフの大きさ、キャンパス内のX軸の位置
 ),
 20 // タイトルが占める縦のパーセンテージ          
 )
); 

$Dataset1 =& Image_Graph::factory('dataset'); 
$Dataset1->addPoint('capten', $menuAry[1]);
$Dataset1->addPoint('m', $menuAry[2]);
$Dataset1->addPoint('kanji', $menuAry[3]); 

// エリアに円として描画
$Plot =& $Plotarea->addNew('pie', array(&$Dataset1));
$Plotarea->hideAxis(); 

// Y軸のマーカーを作成しているらしい
$Marker =& $Plot->addNew('Image_Graph_Marker_Value', IMAGE_GRAPH_PCT_Y_TOTAL);
// 値がグラフのどのあたりに表示されるか
$PointingMarker =& $Plot->addNew('Image_Graph_Marker_Pointing_Angular', array(-40, &$Marker));
// エリアにセット
$Plot->setMarker($PointingMarker);    
// マーカーの表示フォーマットを設定しているらしい
$Marker->setDataPreprocessor(Image_Graph::factory('Image_Graph_DataPreprocessor_Formatted', '%0.1f%%'));

$Plot->Radius = 2;

// グラフの色
$FillArray =& Image_Graph::factory('Image_Graph_Fill_Array');
$Plot->setFillStyle($FillArray);
$FillArray->addNew('gradient', array(IMAGE_GRAPH_GRAD_RADIAL, 'white', 'green'));
$FillArray->addNew('gradient', array(IMAGE_GRAPH_GRAD_RADIAL, 'white', 'blue'));
$FillArray->addNew('gradient', array(IMAGE_GRAPH_GRAD_RADIAL, 'white', 'yellow'));

// グラフの破片の密着度
$Plot->explode(5);

// マーカーの背景とかボーダーとかの色 
$PointingMarker->setLineColor( red );
$Marker->setBorderColor( green );
$Marker->setFillColor( yellow );
    
// グラフを画像として出力
$Graph->done();
 
?>