Graph using PHP GD library

pradeep's Avatar author of Graph using PHP GD library
This is an article on Graph using PHP GD library in PHP.
Rated 5.00 By 2 users
Say if you want to generate graph on your website using data from a data base, you might be wondering how to go about it. Well the best way I would do it is use free PHP GD library.

Here is a class i wrote to generate a graph in a PNG image for me.

PHP Code:
class BarGraph
{
    var 
$barWidth;
    var 
$imgHeight=400;
    var 
$imgWidth=600;
    var 
$bgColor,$barColor;
    var 
$barPadding;
    var 
$data,$rangeMax=10;
    var 
$im;

    function 
init() /* initializes the image */
    
{
        
$this->im=imagecreate($this->imgWidth,$this->imgHeight);
    }

    function 
setHeightWidth($h,$w/** sets the hieght and with of the image **/
    
{
        
$this->imgHeight=$h;
        
$this->imgWidth=$w;
    }

    function 
setBarWidth($width/* sets the bar width */
    
{
        
$this->barWidth=$width;
    }

    function 
setBarPadding($padding/* sets the bar padding */
    
{
        
$this->barPadding=$padding;
    }

    function 
setMax($max/* sets the maximum posible value in the data set */
    
{
        
$this->rangeMax=$max;
    }

    function 
loadData($data/* load data, the input shud be an array */
    
{
        
$this->data=$data;
    }

    function 
setBgColor($r,$g,$b/* sets the background color of the image */
    
{
        
$this->bgColor=imagecolorallocate($this->im,$r,$g,$b);
    }

    function 
setBarColor($r,$g,$b/* sets the bar color of the image */
    
{
        
$this->barColor=imagecolorallocate($this->im,$r,$g,$b);
    }

    function 
drawGraph($flag=0/* to draw graphs on the image */
    
{
        if(
$flag/* flag set to 1 to draw the second bar **/
        
{
            
$t=$this->barWidth+$this->barPadding;
        }
        else 
/* else draws the first bar set */
        
{
            
imagefilledrectangle($this->im,0,0,$this->imgWidth,$this->imgHeight,$this->bgColor);
            
$t=0;
        }

        for ( 
$mon $mon count($this->data) ; $mon ++ ) 
        {
    
            
$X = (($this->imgWidth/count($this->data))*$mon) + $this->barPadding $t;
            
$Y = (10 $this->data[$mon])*($this->imgHeight/$this->rangeMax);
            
$X1 = ($X $this->barWidth);
            
$Y1 $this->imgHeight;

            
imagefilledrectangle($this->im,$X,$Y,$X1,$Y1,$this->barColor);
        }
    }

    function 
renderImage() /* creates the image & sends in to the browser */
    
{
        
header("Content-Type: image/png");
        
imagepng($this->im);
    }

You can refer to all the image functions used here.

Piece of sample code:

PHP Code:
include("bargraph.class.php");

$pr=array(3,6,7,4,5,9,4,5,4,2,1,8);
$p=$pr;
shuffle($p);

$g=new BarGraph;
$g->setHeightWidth(400,600);
$g->init();
$g-setMax(10); //maximum data possible in the data set
$g->setBarWidth(10);
$g->setBarPadding(10);
$g->setBarColor(255,130,130);
$g->setBgColor(204,204,204);
$g->loadData($pr);
$g->drawGraph();

$g->loadData($p);
$g->setBarColor(130,130,255);
$g->drawGraph(1);

$g->renderImage(); 
Example Output:



Enjoy using this,
Do let me know if you have any queries or suggestions.
0
coool's Avatar
Go4Expert Member
Hi

I've tried your code and it's working perfect

but there're many imp. things are missing !

you can see what kind of graphs in my mind by looking at the attached picture
Attached Images
File Type: jpg sampleGraph.JPG (21.8 KB, 81 views)
0
pradeep's Avatar, Join Date: Apr 2005
Team Leader
Mine was a simple demonstration. For advanced graphs, check this out http://pear.php.net/package/Image_Graph
0
gkumar's Avatar
Banned
In this example we are going to draw a simple Bar graph. Take a school for exmaple. We are going to draw a graph for week days and the total number of student that come to school.

First of all we declare two arrays. The first for the student and the second for week days. Then we calculate the maximal number of student. On the basis of that number we are going to calculate the percentage length of the other bar graphs.

Code:
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<title>Simple Bar Graph .. by viji patil</title>
</head>
<body>
<?php
   
        // read the post data
        $data = array('100','200','300','400','500','350','270');
        $x_fld = array('Sun','Mon','Tue','Wen','Thu','Fir','Sat');
        $max = 0;
        for ($i=0;$i<7;$i++){
          if ($data[$i] > $max)$max=$data[$i];  // find the largest data
        }
        $im = imagecreate(320,255); // width , height px

        $white = imagecolorallocate($im,255,255,255); // allocate some color from RGB components remeber Physics
        $black = imagecolorallocate($im,0,0,0);   //
        $red = imagecolorallocate($im,255,0,0);   //
        $green = imagecolorallocate($im,0,255,0); //
        $blue = imagecolorallocate($im,0,0,255);  //
        //
        // create background box
        //imagerectangle($im, 1, 1, 319, 239, $black);
        //draw X, Y Co-Ordinate
        imageline($im, 10, 5, 10, 230, $blue );
        imageline($im, 10, 230, 300, 230, $blue );
        //Print X, Y
        imagestring($im,3,15,5,"Students",$black);
        imagestring($im,3,280,240,"Days",$black);
        imagestring($im,5,100,50,"Simple Graph",$red);
         imagestring($im,5,125,75,"by Vijit",$green);

        // what next draw the bars
        $x = 15;    // bar x1 position
        $y = 230;    // bar $y1 position
        $x_width = 20;  // width of bars
        $y_ht = 0; // height of bars, will be calculated later
        // get into some meat now, cheese for vegetarians;
        for ($i=0;$i<7;$i++){
          $y_ht = ($data[$i]/$max)* 100;    // no validation so check if $max = 0 later;
          imagerectangle($im,$x,$y,$x+$x_width,($y-$y_ht),$red);
          imagestring( $im,2,$x-1,$y+1,$x_fld[$i],$black);
          imagestring( $im,2,$x-1,$y+10,$data[$i],$black);
          $x += ($x_width+20);   // 20 is diff between two bars;
         
        }
        imagejpeg( $im, "graph.jpeg", 90);
        imagedestroy($im);
        echo "<img src='graph.jpeg'><p></p>";
 
?>
</body>
</html>
0
kevin.haghighat's Avatar, Join Date: Apr 2010
Newbie Member
Warning: imagejpeg(): Unable to open 'graph.jpeg' for writing in /test.php on line 49

What is the image graph.jpeg supposed to be?

Kevin.

Quote:
Originally Posted by gkumar View Post
In this example we are going to draw a simple Bar graph. Take a school for exmaple. We are going to draw a graph for week days and the total number of student that come to school.

First of all we declare two arrays. The first for the student and the second for week days. Then we calculate the maximal number of student. On the basis of that number we are going to calculate the percentage length of the other bar graphs.

Code:
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<title>Simple Bar Graph .. by viji patil</title>
</head>
<body>
<?php
   
        // read the post data
        $data = array('100','200','300','400','500','350','270');
        $x_fld = array('Sun','Mon','Tue','Wen','Thu','Fir','Sat');
        $max = 0;
        for ($i=0;$i<7;$i++){
          if ($data[$i] > $max)$max=$data[$i];  // find the largest data
        }
        $im = imagecreate(320,255); // width , height px

        $white = imagecolorallocate($im,255,255,255); // allocate some color from RGB components remeber Physics
        $black = imagecolorallocate($im,0,0,0);   //
        $red = imagecolorallocate($im,255,0,0);   //
        $green = imagecolorallocate($im,0,255,0); //
        $blue = imagecolorallocate($im,0,0,255);  //
        //
        // create background box
        //imagerectangle($im, 1, 1, 319, 239, $black);
        //draw X, Y Co-Ordinate
        imageline($im, 10, 5, 10, 230, $blue );
        imageline($im, 10, 230, 300, 230, $blue );
        //Print X, Y
        imagestring($im,3,15,5,"Students",$black);
        imagestring($im,3,280,240,"Days",$black);
        imagestring($im,5,100,50,"Simple Graph",$red);
         imagestring($im,5,125,75,"by Vijit",$green);

        // what next draw the bars
        $x = 15;    // bar x1 position
        $y = 230;    // bar $y1 position
        $x_width = 20;  // width of bars
        $y_ht = 0; // height of bars, will be calculated later
        // get into some meat now, cheese for vegetarians;
        for ($i=0;$i<7;$i++){
          $y_ht = ($data[$i]/$max)* 100;    // no validation so check if $max = 0 later;
          imagerectangle($im,$x,$y,$x+$x_width,($y-$y_ht),$red);
          imagestring( $im,2,$x-1,$y+1,$x_fld[$i],$black);
          imagestring( $im,2,$x-1,$y+10,$data[$i],$black);
          $x += ($x_width+20);   // 20 is diff between two bars;
         
        }
        imagejpeg( $im, "graph.jpeg", 90);
        imagedestroy($im);
        echo "<img src='graph.jpeg'><p></p>";
 
?>
</body>
</html>
0
johnny.dacu's Avatar, Join Date: Jul 2010
Contributor
Not bad.. still it's more for learning. i don't think GD was planned for something like this. PHP shoud just return data, drawing or bulding graphs shoud be done on cliend side (with flash or js)