Pear::Image_Graph

Image_Graph 汎用ファイル作成

それでは、Image_Graph 汎用ファイル p_gra-62.php を作成します。
作成ファイル内容は、
63Pear Village に戻り
左サイドナビ「Pear::Image_Graph」の中の
Image_Graph 汎用 PHP ファイル
から見てください。
Image_Graph 基本ファイルとの差分は赤色文字にしています。

基本ファイルとの違い

Image_Graph 基本ファイルをよく見ると、表示デ-タの設定は何回も同じこと $Dataset[*]->addPoint('*', **);
繰り返していますね。
ここは for 文を使えば簡単にできそうです。
どうすれば良いか考えていきます。
まずは最初に表示デ-タをまとめてつくることにします。

データ多重配列及び単純配列作成

  1. $data  折線の各 Y 軸値

    まずは折線の各 Y 軸値をまとめてデータ多重配列にします。
    $data = array(
      array(10,13,20,15,12,18),
        // 予測-1
      array( 5, 4, 8,10, 5, 9),
        // 予測-2
      array(22, 0, 0, 0, 0,22),
        // 消線
      array(12,11,19,14,15,14),
        // 実績-1
      array( 5, 3, 9,7.5,8, 4)
        // 実績-2
    );
    このように設定すると
    $data[0][0] = 10
     ・・・・・・
    $data[4][5] = 4
    と言うことになります。

  2. $x  X 軸ラベル

    次ぎに、X 軸ラベルの配列を作ります。
    $x = array('1','2','3','4','5','6');

  3. $l  凡例

    凡例の配列を作ります。
    $l = array('予測-1','予測-2',' ','実績-1','実績-2');

  4. $c  線色

    線色の配列を作ります。
    $c = array( 'red','black','white','red','black');
    最初に描く折線の色は赤で、・・・・ 最後に描く棒グラフの色は黒でしたね。

  5. $aib  グラフの種類

    グラフの種類の配列を作ります。
    $aib = array( 'area','area','impulse','impulse','bar');
    最初に描くグラフは 'area' 折線で、・・・・ 最後に描くのは棒グラフ 'bar' でしたね。

for 文

今回5つのグラフを描いています。
'予測-1' , '予測-2' , ' ' , '実績-1' , '実績-2'
の5本です。
' ' のグラフは '予測-1' , '予測-2' の余計な折線を消去するための折線でした。
よって、for ル-プ数は 0 から 4 とすれば良いはずです。
すなわち、count($l) が for ル-プ数となります。
$l は凡例配列でした。
PHP 関数 count( ) は配列の中に現在含まれる項目数を取得しますので、 count($l) は 5 となります。
よって、dataset Factory method を使って $Dataset[*] objects を5個作成します。
for ($i=0; $i < count($l); $i++){
  $Dataset[$i] = Image_Graph::factory('dataset');
  for ・・・・
    *** addPoint( ) メソッド
    を使ってグラフ描写処理
    ***
  }
}
とすれば良いはずです。

第二の for 文

一つのグラフをつくるには、デ-タの数だけ $Dataset[*] のなかに addPoint(X 軸ポイント名 , Y 軸の値) メソッドで各 XY 座標値を設定してあげれば良いはずです。
デ-タの数は count($data[*]
X 軸ポイント名は $x[$n]
Y 軸の値は $data[*][*]
から求められますので、
for ($n = 0; $n < count($data[$i]); $n++) {
  $Dataset[$i] -> addPoint($x[$n],$data[$i][$n]);
}
とすれば良いことになります。

第一の for 文

あとは第一の for 文に戻って凡例名を設定
$Dataset[$i]->setName($l[$i]);
どんなグラフを描くのか
$Plot = $Plotarea -> addNew($aib[$i], array($Dataset[$i]));
ラインの色設定
$Plot->setLineColor($c[$i]);
すれば、OK です。
でもちょっと待ってください。
'bar' グラフの時は棒の内部の色と棒間隔の設定が必要でした。
if 文を使って、この二つを設定します。
if ($aib[$i]=='bar'){
  $fillColor->addColor('black');
  $Plot->setFillStyle($fillColor);
  $Plot->setSpacing(59);
}
とします。
for 文全体をまとめると

   
  for ($i=0; $i < count($l); $i++) {
  $Dataset[$i] =
   Image_Graph::factory('dataset');
   for (
    $n = 0; $n < count($data[$i]); $n++)
   {
    $Dataset[$i] -> 
     addPoint($x[$n],$data[$i][$n]);
   }
  $Dataset[$i]->setName($l[$i]);
  $Plot = $Plotarea -> addNew
   ($aib[$i],array($Dataset[$i]));
  $Plot->setLineColor($c[$i]);
  if ($aib[$i]=='bar'){
   $fillColor->addColor('black');
   $Plot->setFillStyle($fillColor);
   $Plot->setSpacing(59);
  }
 }

となります。
これで、基本ファイルとの差分説明は終わりです。

問題点

ここまで、'line' グラフが描けないため、バグ回避をしながら折線グラフを描いてきました。
扱ったのは、総売上予測値と主力製品売上予測値の折線グラフでした。
総売上予測値 > 主力製品売上予測値
の関係があるので、二つの折線はクロスすることはありません。
よって、バグ回避ができたのですが、もしクロスするようなことがあると 後から描いた折線グラフのエリアが最初に描いたグラフの上にきてしまい、 先のグラフが消えてしまいます。
これを回避しようとするともっと大変です。
それではどうしたら良いのか、有料のクラス JpGraph を使用すれば可能です。
非営利目的で使用する場合ならコミュニティ版を使用すれば無料です。
私のように、アフィリエイト広告を載せてしまうとちょっと無理かもしれません。
マニュアルも整備されています。

引き続き、作成したファイルの動作確認をしていきます。


Image_Graph 動作確認 に続く
Image_Graph 基本ファイル作成-2 に戻る

63Pear Villageに戻る