Version: 1
Type: Class
Category: Graphics
License: GNU General Public License
Description: A quick (dirty) class I wrote to plot a line chart based on given values. It is quite basic but is fairly usable.
<?php Class DrawGraph { private $graph_data; private $image_holder; private $fixed_range_minimum; private $fixed_range_maximum; private $fixed_image_width; private $fixed_image_height; private $actual_image_height; private $image_padding; private $y_step_range; private $y_block_step; private $x_block_step; private $background_colour; private $line_1_colour; private $axis_line_colour; private $axis_text_colour; private $axis_value_colour; function __construct($data_array, $image_width=200, $image_height=200, $padding=10, $y_levels=10, $image_colour=array()) { if (count($image_colour)!=3) $image_colour=array(240,240,240); $this->graph_data=$data_array; $this->image_padding=$padding; $this->fixed_image_width=$image_width; $this->fixed_image_height=$image_height; $this->actual_image_height=$image_height+($padding*2); $sorted_array=$data_array; sort($sorted_array); $this->fixed_range_minimum=floor($sorted_array[0]); $this->fixed_range_maximum=ceil($sorted_array[count($sorted_array)-1]); $actual_range=$this->fixed_range_maximum-$this->fixed_range_minimum; $this->y_step_range=ceil($actual_range/$y_levels); $this->y_block_step=$image_height/$actual_range; $this->x_block_step=$image_width/count($data_array); $this->image_holder = @ImageCreate ($image_width+($padding*4), $this->actual_image_height + ($padding*4) ); $this->background_colour = ImageColorAllocate ($this->image_holder, $image_colour[0], $image_colour[1], $image_colour[2]); $this->title_text_colour = ImageColorAllocate ($this->image_holder, 0, 0, 0); $this->line_1_colour = ImageColorAllocate ($this->image_holder, 233, 14, 91); $this->axis_line_colour = ImageColorAllocate ($this->image_holder, 0, 0, 254); $this->axis_text_colour = ImageColorAllocate ($this->image_holder, 0, 0, 0); $this->axis_value_colour = ImageColorAllocate ($this->image_holder, 0, 0, 0); } function drawYAxis() { for($a=$this->fixed_range_minimum; $a<=$this->fixed_range_maximum; $a+=$this->y_step_range) { $ypos=round( ($this->fixed_image_height+$this->image_padding) - ( ( $a - $this->fixed_range_minimum ) * $this->y_block_step) ); imageline($this->image_holder, ($this->image_padding*2)-6, $ypos, ($this->image_padding*2)-2, $ypos, $this->axis_line_colour); imagestring($this->image_holder, 1, 2, $ypos-8, $a, $this->axis_text_colour); } } function drawData($x_axis_labels=array(), $title="") { imagestring($this->image_holder, 2, $this->fixed_image_width/2, ($this->actual_image_height + ($this->image_padding*2))+($this->image_padding/2), $title, $this->title_text_colour); $this->drawYAxis(); //Pad x axis label array if it doesnt have enough values in if (count($x_axis_labels)<count($this->graph_data)) $x_axis_labels = array_pad($x_axis_labels, count($this->graph_data), ""); for($a=0; $a<count($this->graph_data); $a++) { //Draw x axis line imageline($this->image_holder, ($a*$this->x_block_step)+($this->image_padding*3), ($this->actual_image_height+$this->image_padding)-2, ($a*$this->x_block_step)+($this->image_padding*3), ($this->actual_image_height+$this->image_padding)-7, $this->axis_line_colour); //Draw x axis label imagestring($this->image_holder, 1, ( ($a*$this->x_block_step) + $this->image_padding) + ($this->image_padding*2), $this->actual_image_height + $this->image_padding, $x_axis_labels[$a], $this->axis_text_colour); //Draw Point Value imagestring($this->image_holder, 1, ( ($a*$this->x_block_step) + ($this->image_padding*3)) + 2, round( ($this->fixed_image_height+$this->image_padding) - ( ( $this->graph_data[$a] - $this->fixed_range_minimum ) * $this->y_block_step) ), $this->graph_data[$a], $this->axis_value_colour); //If this is the second value then can plot a line if ($a>0) { $x1=(($a-1)*$this->x_block_step)+($this->image_padding*3); $x2=($a*$this->x_block_step)+($this->image_padding*3); $y1=($this->fixed_image_height + $this->image_padding) - (( $this->graph_data[$a-1] - $this->fixed_range_minimum ) * $this->y_block_step); $y2=($this->fixed_image_height + $this->image_padding) - (( $this->graph_data[$a] - $this->fixed_range_minimum ) * $this->y_block_step); imageline ($this->image_holder, $x1, $y1, $x2, $y2, $this->line_1_colour); } } } function rotateGraph($value) { $this->image_holder=imagerotate($this->image_holder, $value, 0); } function outputGraph() { header ("Content-type: image/png"); ImagePng($this->image_holder); } function updateColour($type, $colourData=array(0,0,0)) { if (count($colourData)!=3) $type=""; switch ($type) { case "title": $this->title_text_colour = ImageColorAllocate ($this->image_holder, $colourData[0], $colourData[1], $colourData[2]); break; case "line1": $this->line_1_colour = ImageColorAllocate ($this->image_holder, $colourData[0], $colourData[1], $colourData[2]); break; case "axis_line": $this->axis_line_colour = ImageColorAllocate ($this->image_holder, $colourData[0], $colourData[1], $colourData[2]); break; case "axis_text": $this->axis_text_colour = ImageColorAllocate ($this->image_holder, $colourData[0], $colourData[1], $colourData[2]); break; case "axis_value": $this->axis_value_colour = ImageColorAllocate ($this->image_holder, $colourData[0], $colourData[1], $colourData[2]); break; } } } ?>