finalizeColors(); $barCount = 0; $adjustment = 0; $last_y1 = array(); $last_y2 = array(); if ($this->bool_user_data_range && $this->data_min >= 0) { $adjustment = $this->data_min * $this->unit_scale; } $this->data_array = array_reverse($this->data_array); foreach ($this->data_array as $data_set_num => $data_set) { $lineX2 = null; $xStart = $this->y_axis_x1 + ($this->space_width / 2); foreach ($data_set as $key => $item) { $hideBarOutline = false; $x1 = round($xStart); $x2 = round($xStart + $this->bar_width); if ($data_set_num > 0) { //find last set valid value for this dataset incase prior values were not set $found = false; $i = 1; //default last to base in case none are found $last = $this->x_axis_y1; while ($found == false && ($data_set_num - $i) >= 0) { if (isset($last_y1[$data_set_num - $i][$key])) { $last = $last_y1[$data_set_num - $i][$key]; $found = true; } $i++; } $y2 = round($last); $y1 = round(($y2 - ($item * $this->unit_scale) + $adjustment)); } else { $y2 = round($this->x_axis_y1); $y1 = round((($this->x_axis_y1 - ($item * $this->unit_scale) + $adjustment))); } //if we are using a user specified data range, need to limit what's displayed if ($this->bool_user_data_range) { if ($item <= $this->data_range_min) { //don't display, we are out of our allowed display range! $y1 = $y2; $hideBarOutline = true; } elseif ($item >= $this->data_range_max) { //display, but cut off display above range max $y1 = $this->x_axis_y1 - ($this->actual_displayed_max_value * $this->unit_scale) + $adjustment; } } //draw bar and outline if nonzero if ($this->bool_bars && $item != 0) { if ($this->bool_gradient) { $this->drawGradientBar($x1, $y1, $x2, $y2, $this->multi_gradient_colors_1[$data_set_num], $this->multi_gradient_colors_2[$data_set_num], $data_set_num); } else { imagefilledrectangle($this->image, $x1, $y1,$x2, $y2, $this->multi_bar_colors[$data_set_num]); } //draw bar outline if ($this->bool_bar_outline && !$hideBarOutline) { imagerectangle($this->image, $x1, $y1, $x2, $y2, $this->outline_color); } } // display data values if ($this->bool_data_values) { $dataX = ($x1 + ($this->bar_width) / 2) - ((strlen($item) * self::DATA_VALUE_TEXT_WIDTH) / 2); //value to be graphed is equal/over 0 if ($item >= 0) { $dataY = $y1 - $this->data_value_padding - self::DATA_VALUE_TEXT_HEIGHT; } else { //check for item values below user spec'd range if ($this->bool_user_data_range && $item <= $this->data_range_min) { $dataY = $y1 - $this->data_value_padding - self::DATA_VALUE_TEXT_HEIGHT; } else { $dataY = $y1 + $this->data_value_padding; } } //add currency sign, formatting etc if ($this->data_format_array) { $item = $this->applyDataFormats($item); } if ($this->data_currency) { $item = $this->applyDataCurrency($item); } //recenter data position if necessary $dataX -= ($this->data_additional_length * self::DATA_VALUE_TEXT_WIDTH) / 2; imagestring($this->image, 2, $dataX, $dataY, $item, $this->data_value_color); } //write x axis value if ($this->bool_x_axis_values) { if ($data_set_num == $this->data_set_count - 1) { if ($this->bool_x_axis_values_vert) { if ($this->bool_all_negative) { //we must put values above 0 line $textVertPos = round($this->y_axis_y2 - self::AXIS_VALUE_PADDING); } else { //mix of both pos and neg numbers //write value y axis bottom value (will be under bottom of grid even if x axis is floating due to $textVertPos = round($this->y_axis_y1 + (strlen($key) * self::TEXT_WIDTH) + self::AXIS_VALUE_PADDING); } $textHorizPos = round($xStart + ($this->bar_width / 2) - (self::TEXT_HEIGHT / 2)); imagestringup($this->image, 2, $textHorizPos, $textVertPos, $key, $this->x_axis_text_color); } else { if ($this->bool_all_negative) { //we must put values above 0 line $textVertPos = round($this->y_axis_y2 - self::TEXT_HEIGHT - self::AXIS_VALUE_PADDING); } else { //mix of both pos and neg numbers //write value y axis bottom value (will be under bottom of grid even if x axis is floating $textVertPos=round($this->y_axis_y1 + (self::TEXT_HEIGHT * 2 / 3) - self::AXIS_VALUE_PADDING); } //horizontal data keys $textHorizPos = round($xStart + ($this->bar_width / 2) - ((strlen($key) * self::TEXT_WIDTH) / 2)); imagestring($this->image, 2, $textHorizPos, $textVertPos, $key, $this->x_axis_text_color); } } } $xStart += $this->bar_width + $this->space_width; $last_y1[$data_set_num][$key] = $y1; } } } public function addData($data, $data2 = '', $data3 = '', $data4 = '', $data5 = '') { parent::addData($data, $data2, $data3, $data4, $data5); $key_max = array(); //loop through each row, adding values to keyed arrays to find combined max foreach ($this->data_array as $data_set_num => $data_set) { foreach ($data_set as $key => $item) { $key_max[$key] = isset($key_max[$key]) ? $key_max[$key] + $item : $item; if ($key_max[$key] < $this->data_min) { $this->data_min = $key_max[$key]; } if ($key_max[$key] > $this->data_max) { $this->data_max = $key_max[$key]; } } } } public function setLine($bool) { $this->error[] = __function__ . '() function not allowed in PHPGraphLib Stacked extension.'; } public function setDataPointSize($bool) { $this->error[] = __function__ . '() function not allowed in PHPGraphLib Stacked extension.'; } public function setDataPoints($bool) { $this->error[] = __function__ . '() function not allowed in PHPGraphLib Stacked extension.'; } public function setDataValues($bool) { $this->error[] = __function__ . '() function not allowed in PHPGraphLib Stacked extension.'; } }