[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

Drawing a  Pie-Chart

Posted on 2000-04-10
6
Medium Priority
?
538 Views
Last Modified: 2006-11-17
I have three values say A=10, B=15, C=20.
I want to represent this values in a graphical format with the help of a pie-chart.

can any body help me how to solve the above.
0
Comment
Question by:qader99
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 1

Expert Comment

by:mafweb
ID: 2699894
have a look at the image creation possibilities of PHP:

http://www.php3.de/manual/features.images.php3

0
 
LVL 8

Accepted Solution

by:
us111 earned 400 total points
ID: 2699933
Try this class.
It's not mine, I've just try it
It works....

Enjoy yourself with pie



<?php  /*  -*-  C  -*-  */  
 /*  
 **  $Id:  piechart.phl,v  1.2  1998/02/03  16:55:06  borud  Exp  $  
 **  
 **  PHP  Class  for  creating  pie  charts  using  the  GD  library  functions.  
 **  
 **  There  is  a  bug  in  the  GD  library  somewhere  that  seems  to  kick  in  
 **  when  you  try  to  return  images  that  are  larger  than  4K.    We  probably  
 **  need  a  workaround  for  this...  
 **  
 **  Pie  charts  look  a  bit  shabby.    There  seems  to  be  one  or  more  
 **  roundoff  errors  lurking  about  making  life  hard  for  us.    To  fix  this  
 **  we  should  perhaps  investigate  how  the  Arc-drawing  thingey  works  and  
 **  try  to  find  out  how  it  gets  the  endpoints.    Also  the  flood-filler  
 **  doesn't  quite  cope  with  filling  the  pieces  very  well.  
 **  
 **  Authors:  Bjørn  Borud,  Guardian  Networks  AS,  <borud@guardian.no>  
 */  

 /*  {{{  piechart  */  

 /*  
 **    This  is  a  class  for  creating  pie  charts.    Generally  you  just  have  
 **    to  instantiate  it,  and  then  make  a  call  to  the  "init"  method  to  
 **    set  the  size  and  transfer  the  data.  
 **  
 **    The  data  is  an  array  of  arrays  that  consist  the  following  data:  
 **        o  numeric  value  
 **        o  value  legend  
 **        o  red    \  
 **        o  green  >  the  RGB  values  for  the  color  of  the  slice/legend  
 **        o  blue  /  
 **  
 */  

 class  piechart  {  
 /*  {{{  attributes  */  

     var  $im;  
     var  $width,  $height;  

     var  $data;  
     var  $colors;  
     var  $angles;  

     var  $left=10;  
     var  $right=200;  
     var  $top=100;  
     var  $bottom=10;  
     var  $head_top=10;  
     var  $head_space=5;  

     var  $legend_left=20;  

     var  $center_x;  
     var  $center_y;  
     var  $diameter;  

     /*  sum  of  values  */  
     var  $sum;  

     /*  font  sizes  */  
     var  $fx,  $fy;  

     var  $legend_num  =  "";  

 /*  }}}  */  
 /*  {{{  constants  */  

     var  $PI  =  3.1415926535897931;  

 /*  }}}  */  
 /*  {{{  roundoff  */  

     /*  
     **  PHP  has  no  function  for  rounding  off  doubles  to  the  nearest  
     **  integer  so  we  have  to  roll  our  own.  
     */  
     function  roundoff  ($v)  {  
         if  (  $v  -  floor($v)  >=  0.5)  {  
             return(ceil($v));  
         }  else  {  
             return(floor($v));  
         }  
     }  

 /*  }}}  */  
 /*  {{{  deg2rad  */  

     /*  
     **  The  built-in  trig  functions  use  radians  and  there's  no  
     **  function  in  PHP  to  convert  between  degrees  and  radians  
     */  

     function  deg2rad  ($degrees)  {  
         return  (($this->PI  *  $degrees)  /  doubleval(180));  
     }  

 /*  }}}  */  
 /*  {{{  get_xy_factors  */  

     /*  
     **  Calculate  the  directional  vector  for  the  sides  of  the  
     **  piece  of  pie.  
     */  

     function  get_xy_factors  ($degrees)  {  
         $x  =  cos($this->deg2rad($degrees));  
         $y  =  sin($this->deg2rad($degrees));  
         return  (array($x,  $y));  
     }  

 /*  }}}  */  
 /*  {{{  init  */  

     /*  
     **  Initialize  the  object  and  draw  the  pie.    This  would  be  the  
     **  constructor  in  an  ordinary  OO  scenario  --  just  that  we  haven't  
     **  got  constructors  in  PHP,  now  do  we?  ;-)  
     */  

     function  init  ($w,  $h,  $d)  {  
         $this->im        =  ImageCreate($w,  $h);  
         $this->width    =  $w;  
         $this->height  =  $h;  

         $this->data  =  $d;  

         $this->da_width  =  ($this->width  -  $this->left  -  $this->right);  
         $this->da_height  =  ($this->height  -  $this->top  -  $this->bottom);  

         $this->center_x  =  intval($this->left  +  ($this->da_width  /  2));  
         $this->center_y  =  intval($this->top    +  ($this->da_height  /  2));  


         /*  font  sizes  */  
         $this->fx  =  array(0,  5,6,7,8,9);  
         $this->fy  =  array(0,  7,8,10,14,11);  

         /*  decide  the  diameter  of  the  pie  */  

         if  ($this->da_height  >  $this->da_width)  {  
             $this->diameter  =  $this->da_width;  
         }  else  {  
             $this->diameter  =  $this->da_height;  
         }  

         $this->white  =  ImageColorAllocate($this->im,  255,  255,  255);  
         $this->black  =  ImageColorAllocate($this->im,      0,      0,      0);  

         $n  =  count($this->data);  
         for  ($i  =  0;  $i  <  $n;  $i++)  {  
             $this->colors[$i]  =  ImageColorAllocate($this->im,  $this->data[$i][2],      
                                                                               $this->data[$i][3],  
                                                                               $this->data[$i][4]);  
             $this->sum  +=  $this->data[$i][0];  
         }  

         $from  =  0;        $to  =  0;  

         for  ($i  =  0;  $i  <  $n;  $i++)  {  

             $this->angles[$i]  =  $this->roundoff(($this->data[$i][0]  *  360)  
                                                                                     /  doubleval($this->sum));  
             $to  =  $from  +  $this->angles[$i];  
             $col  =  $this->colors[$i];  
             
             $foo  =  $this->angles[$i];  
             $this->draw_slice($this->center_x,  
                                                 $this->center_y,  
                                                 $from,  
                                                 $to,  
                                                 $this->colors[$i]);  
             $from  +=  $this->angles[$i];  
         }  
     }  

 /*  }}}  */  
 /*  {{{  set_legend_percent  */  

 /*  utility  function  to  set  an  attribute  so  we  display  percentages  */      
     function  set_legend_percent  ()  {  
         $this->legend_num  =  "p";  
     }  

 /*  }}}  */  
 /*  {{{  set_legend_value  */  

     /*  utility  function  to  set  an  attribute  so  we  display  values  */      
     function  set_legend_value  ()  {  
         $this->legend_num  =  "v";  
     }  

 /*  }}}  */  
 /*  {{{  draw_point  */  

     /*  
     **  This  function  is  just  here  for  debugging  purposes.    It  is  
     **  sometimes  very  useful  to  be  able  to  draw  an  X  to  check  
     **  coordinates.  
     */  
     function  draw_point($x,  $y)  {  
         ImageLine($this->im,  $x-4,  $y-4,  $x+4,  $y+4,  $this->black);  
         ImageLine($this->im,  $x-4,  $y+4,  $x+4,  $y-4,  $this->black);  
     }  

 /*  }}}  */  
 /*  {{{  draw_margins  */  

     /*  
     **  Also  a  debugging  function  to  show  where  the  margins  are  at  
     */  
     function  draw_margins  ()  {  

         ImageLine($this->im,  0,  $this->top,  $this->width,  
                             $this->top,  
                             $this->black);        

         ImageLine($this->im,  0,  $this->height  -  $this->bottom,  
                             $this->width,  $this->height  -  $this->bottom,  
                             $this->black);  

         ImageLine($this->im,  $this->left,  0,  $this->left,  
                             $this->height,  $this->black);  

         ImageLine($this->im,  $this->width  -  $this->right,  
                             0,  $this->width  -  $this->right,  
                             $this->height,  $this->black);  
     }  

 /*  }}}  */  
 /*  {{{  draw_legends  */  

     /*  
     **  Draw  legends  at  the  right  side  of  the  pie  chart.    This  function  
     **  accepts  a  fontsize  and  gathers  all  the  other  information  from  
     **  the  multilevel  data  array  
     */  
     function  draw_legends  ($fontsize)  {  
         $n  =  count($this->data);  

         $x1  =  $this->width  -  $this->right  +  $this->legend_left;  
         $x2  =  $x1  +  $this->fy[$fontsize];;  

         for  ($i  =  0;  $i  <  $n;  $i++)  {  

             /*  determine  Y  coordinates  */  
             $y1  =  ($i  *  $this->fy[$fontsize]  *  1.5)  +  $this->top;  
             $y2  =  $y1  +  $this->fy[$fontsize];  

             /*  draw  the  legend  color  rectangle  */  
             ImageFilledRectangle($this->im,  $x1,  $y1,  $x2,  $y2,  $this->colors[$i]);  
             ImageRectangle($this->im,  $x1,  $y1,  $x2,  $y2,  $this->black);  

             $legend  =  $this->data[$i][1];  

             /*  decide  what  to  show  after  legend  */  
             switch  ($this->legend_num)  {  
             case  "v":  
                 $legend  .=  sprintf( "  (%.2f)",  $this->data[$i][0]);  
                 break;  
             case  "p":  
                 $legend  .=  sprintf( "  (%.2f%%)",  
                                                       ($this->data[$i][0]  
                                                         *  100  /  doubleval($this->sum)));  
                 break;  
             }  

             ImageString($this->im,  $fontsize,  $x2  +  5,  $y1,  
                                     $legend,  $this->black);  
         }  
     }  

 /*  }}}  */  
 /*  {{{  draw_heading  */  

     /*  
     **  This  function  accepts  an  array  of  arrays  containing  (in  order):  
     **    o  The  text  of  the  heading  as  a  string  
     **    o  The  fontsize  as  an  integer  
     **    o  The  justification  ("c"=center)  
     **  
     */  
     function  draw_heading($head_data)  {  
         $n  =  count($head_data);  

         $y  =  $this->head_top;  
         for  ($i  =  0;  $i  <  $n;  $i++)  {  
             
             switch($head_data[$i][2])  {  
             case  "c":  
                 $x  =  ($this->width  -  $this->fx[$head_data[$i][1]]  
                             *  strlen($head_data[$i][0]))  /  2;  
                 break;  

             case  "r":  /*  uses  left  margin  here...  */  
                 $x  =  $this->width  -  $this->left  -  
                     ($this->fx[$head_data[$i][1]]  *  strlen($head_data[$i][0]));  
                 break;  

             default:  
                 $x  =  $this->left;  
                 break;  


             }  

             ImageString($this->im,  $head_data[$i][1],  $x,  $y,  $head_data[$i][0],  
                                     $this->black);  

             $y  +=  ($this->fy[$head_data[$i][1]]  +  $this->head_space);            
         }  
     }  

 /*  }}}  */  
 /*  {{{  draw_slice  */  

     /*  
     **  This  function  draws  a  piece  of  pie  centered  at  x,y  starting  at  
     **  "from"  degrees  and  ending  at  "to"  degrees  using  the  specified  color.  
     */  
     function  draw_slice  ($x,  $y,  $from,  $to,  $color)  {  

         #  Awful  Kludge!!!  
         if  ($to  >  360)  {  
             $to  =  360;  
         }  

         ImageArc($this->im,  $this->center_x,  $this->center_y,  
                           $this->diameter,  $this->diameter,  $from,  $to,  $color);  

         /*  First  line  */  
         $axy2  =  $this->get_xy_factors($from);  
         $ax2  =  floor($this->center_x  +  ($axy2[0]  *  ($this->diameter  /2)));  
         $ay2  =  floor($this->center_y  +  ($axy2[1]  *  ($this->diameter  /2)));  
         ImageLine($this->im,  $this->center_x,  $this->center_y,  $ax2,  $ay2,  $color);  

         /*  Second  line  */  
         $bxy2  =  $this->get_xy_factors($to);  
         $bx2  =  ceil($this->center_x  +  ($bxy2[0]  *  ($this->diameter  /2)));  
         $by2  =  ceil($this->center_y  +  ($bxy2[1]  *  ($this->diameter  /2)));  
         ImageLine($this->im,  $this->center_x,  $this->center_y,  $bx2,  $by2,  $color);  


         /*  decide  where  to  start  filling,  then  fill  */  
         $xy2  =  $this->get_xy_factors((($to  -  $from)  /  2)  +  $from);  
         $x2  =  floor($this->center_x  +  ($xy2[0]  *  ($this->diameter  /3)));  
         $y2  =  floor($this->center_y  +  ($xy2[1]  *  ($this->diameter  /3)));  
         ImageFillToBorder($this->im,  $x2,  $y2,  $color,  $color);  
     }  

 /*  }}}  */  
 /*  {{{  display  */  

     /*  
     **  Make  sure  the  legends  are  drawn,  then  output  the  image  to  the  
     **  client  
     */  
     function  display()  {  

         $this->draw_legends(2);  
 #        $this->draw_margins();  

         ImageGif($this->im,  "/tmp/pie.gif");  

         Header( "Content-type:  image/gif");  
         ImageGif($this->im);  
     }  

 /*  }}}  */  
 };  

 /*  }}}  */  


 /*  {{{  Test  code  */  

 $vals  =  array(  
                             array(100,  "First  value",  190,  0  ,0),  
                             array(100,  "Second  value",  0,  190,  0),  
                             array(100,  "Third  value",  0,  0  ,190),  
                             array(100,  "Fourth  value",  0,  190  ,190),  
                             array(301.2437,  "Fifth  value",  204,  0  ,204),  
                             array(308,  "Sixth  value",  204,204,0)  
                             );  


 $heads  =  array(  
                               array( "First  line  (centered)",  4,  "c"),  
                               array( "Second  line  (left  justified)",  4,  "l"),  
                               array( "Third  line  (right  justified)",  4,  "r")  
                               );  


 $pie  =  new  piechart;  
 $pie->init(400,  300,  $vals);  
 $pie->draw_heading($heads);  
 $pie->set_legend_percent();  
 $pie->display();  

 /*  }}}  */  

 /*  
   *  Local  Variables:  
   *  tab-width:  3  
   *  End:  */  
 ?>
0
 

Author Comment

by:qader99
ID: 2700071
Thankyou us111.

I studied the whole code but could not make out where to pass or initialize my values to be shown in pie.

There is an array called data but  I was not able to pass values to it.

Please Help

Thank You
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 8

Expert Comment

by:us111
ID: 2700181
$vals  =  array(
                                                   array(10,  "First  value",  190,  0  ,0),
                                                   array(20,  "Second  value",  0,  190,  0),
                                                   array(30,  "Third  value",  0,  0  ,190)
                                                                   );

The first param is your values,
190,0,0 should the color (RGB).
0
 

Author Comment

by:qader99
ID: 2707256
I tried to ececute the above code but it is giving me an error (" call to unsupported or undefined functions ") in all the Image.. fuctions used

for example ImageCreate, ImageFill, ImageColorAllocate, ImageLine, ImageFilltoBorder, ImageArc etc.

Please please let me know what is the problem.
0
 
LVL 8

Expert Comment

by:us111
ID: 2707296
hmm bad, you don't have php compiled with the GD library that's why  you can't use these function.

Do you use NT or Unix ??
if you use NT uncomment the line
extension=php3_gd.dll
in the php.ini file

if you use unix... I don't really know how to compil php with the GD library.
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
I imagine that there are some, like me, who require a way of getting currency exchange rates for implementation in web project from time to time, so I thought I would share a solution that I have developed for this purpose. It turns out that Yaho…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
Suggested Courses

650 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question