Exemple #1
0
 public function __construct($bgw = BG_WIDTH, $bgh = BG_HEIGHT, $left = LINE_LEFT, $top = LINE_TOP, $area_width = LINE_AREA_WIDTH, $area_height = LINE_AREA_HEIGHT)
 {
     parent::__construct($bgw, $bgh, $left, $top, $area_width, $area_height);
 }
 /**
  * 折れ線グラフの作成
  *
  * @param string $keyname
  * @param string $type
  * @param string $xtitle
  * @param string $ytitle
  * @param boolean $xincline
  */
 public function lfGetGraphLine($arrResults, $keyname, $type, $xtitle, $ytitle, $sdate, $edate, $xincline)
 {
     $ret_path = '';
     // 結果が0行以上ある場合のみグラフを生成する。
     if (count($arrResults) > 0 && $this->install_GD) {
         // グラフの生成
         $arrList1 = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname, 'add_point');
         $arrList2 = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname, 'minus_point');
         $arrList3 = SC_Utils_Ex::sfArrKeyValue($arrResults, $keyname, 'total_sum');
         array_walk($arrList1, function ($v, $k) use(&$arrList1) {
             $arrList1[$k] = max($v, 0);
         });
         array_walk($arrList2, function ($v, $k) use(&$arrList2) {
             $arrList2[$k] = max($v, 0);
         });
         array_walk($arrList3, function ($v, $k) use(&$arrList3) {
             $arrList3[$k] = max($v, 0);
         });
         GC_Utils_Ex::gfDebugLog(array($arrList1, $arrList2, $arrList3));
         // 一時ファイル名の取得
         $pngname = $this->lfGetGraphPng($type);
         // ラベル表示インターバルを求める
         $base = 30;
         $interval = intval(count($arrList1) / $base);
         if ($interval < 1) {
             $interval = 1;
         }
         // X ラベルが 20以下になるまでインターバルを変更する
         while (count($arrList1) / $interval > 30) {
             $base++;
             $interval = intval(count($arrList1) / $base);
         }
         $objGraphLine = new SC_Graph_Line_Ex();
         $objGraphLine->init();
         // 値のセット
         $objGraphLine->setXLabel(array_keys($arrList1));
         // 複数レジェンドの場合は共通メソッドが使えない
         $objGraphLine->arrDataList[$objGraphLine->line_max++] = array_values($arrList1);
         $objGraphLine->arrDataList[$objGraphLine->line_max++] = array_values($arrList2);
         $objGraphLine->arrDataList[$objGraphLine->line_max++] = array_values($arrList3);
         $allData = array();
         foreach ($objGraphLine->arrDataList as $arrDataList) {
             $allData = array_merge($allData, $arrDataList);
         }
         GC_Utils_Ex::gfDebugLog($allData);
         // $objGraphLine->setMax ( $allData );
         $this->setMax($objGraphLine, $allData);
         // 値の描画変換率
         $rate = $objGraphLine->area_height / $objGraphLine->graph_max;
         // 描画率を計算
         $objGraphLine->arrPointList = array();
         foreach ($objGraphLine->arrDataList as $index => &$arrDataList) {
             GC_Utils_Ex::gfDebugLog($arrDataList);
             $count = count($arrDataList);
             $scale_width = $objGraphLine->area_width / ($count + 1);
             $objGraphLine->arrPointList[$index] = array();
             for ($i = 0; $i < $count; $i++) {
                 // X座標を求める
                 $x = intval($objGraphLine->left + $scale_width * ($i + 1));
                 // Y座標を求める
                 if ($arrDataList[$i] > 0) {
                     $y = intval($objGraphLine->top + $objGraphLine->area_height - $arrDataList[$i] * $rate);
                 } else {
                     // マイナス値の場合は底べた
                     $y = intval($objGraphLine->top + $objGraphLine->area_height);
                 }
                 // XY座標を保存する
                 $objGraphLine->arrPointList[$index][] = array($x, $y);
             }
         }
         GC_Utils_Ex::gfDebugLog($objGraphLine->arrPointList);
         $objGraphLine->setLegend(array("追加", "消費", "残高"));
         // ラベル回転(日本語不可)
         if ($xincline == true || count($arrList1) > 20) {
             $objGraphLine->setXLabelAngle(45);
         }
         // タイトルセット
         $objGraphLine->setXTitle($xtitle);
         $objGraphLine->setYTitle($ytitle);
         // メインタイトル作成
         list($sy, $sm, $sd) = preg_split('|[/ ]|', $sdate);
         list($ey, $em, $ed) = preg_split('|[/ ]|', $edate);
         $start_date = $sy . '年' . $sm . '月' . $sd . '日';
         $end_date = $ey . '年' . $em . '月' . $ed . '日';
         $objGraphLine->drawTitle('集計期間:' . $start_date . ' - ' . $end_date);
         // グラフ描画
         // $objGraphLine->drawGraph ();
         $this->drawGraph($objGraphLine);
         // グラフの出力
         if (DRAW_IMAGE) {
             $objGraphLine->outputGraph();
             SC_Response_Ex::actionExit();
         }
         // ファイルパスを返す
         $ret_path = GRAPH_URLPATH . $pngname;
     }
     return $ret_path;
 }