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; }