Using php to draw pie chart implementation code

  • 2020-06-07 04:08:26
  • OfStack

The drawPieImg() function contains eight arguments, and $title is the title of the pie chart; $dataArr is the data array to display; $labelArr is the tag classification array for the corresponding data; $colorArr is the array of drawing colors for the corresponding data. These four parameters are required and can be passed to different systems. The next four parameters are responsible for setting the size of the pie chart to be generated, or using the system default if not set. The program starts drawing from 0 degree according to the size of the bed base, and draws the sector size occupied by the corresponding data in turn according to the clockwise direction.

<?php
 // Variable definition, the Angle of an elliptic arc 
 define("ANGLELENGTH",3);
 /**
  *  Draw pictures 
  * @param $title 3D The title of the figure 
  * @param $dataArr  Displays an array of data 
  * @param $labelArr  An array of tag classifications for the corresponding data 
  * @param $colorArr  An array that corresponds to the drawing color 
  * @param $a   The base width of the canvas 
  * @param $b   The base height of the canvas 
  * @param $v  3D The height of the column 
  * @param $font  The font size 
  * @return    Draw a successful image access path 
  */
 function drawPieImg($title, $dataArr, $labelArr, $colorArr, $a=250, $b=120, $v=20, $font=10){
  $ox = 5+$a;
  $oy = 5+$b;
  $fw = imagefontwidth($font);
  $fh = imagefontheight($font);
  $n = count($dataArr);// Calculate array length 
  $w = 10+$a*2;
  $h = 10+$b*2+$v+($fh+2)*$n;
  // Create a drawing board 
  $img = imagecreate($w, $h);
  // turn RGB For the index of color 
  for($i=0; $i<$n; $i++)
   $colorArr[$i] = drawIndexColor($img,$colorArr[$i]);// For the image $img Distribution of color 
  $clrbk = imagecolorallocate($img, 0xff, 0xff, 0xff);
  $clrt = imagecolorallocate($img, 0x00, 0x00, 0x00);
  // Fill background color 
  imagefill($img, 0, 0, $clrbk);
  // sum 
  $tot = 0;
  for($i=0; $i<$n; $i++)
   $tot += $dataArr[$i];
  // The initial Angle size of each category 
  $sd = 0;
  // The Angle occupied by each category 
  $ed = 0;
  $ly = 10+$b*2+$v;
  for($i=0; $i<$n; $i++){
   $sd = $ed;
   $ed += $dataArr[$i]/$tot*360;
   // draw 3d sector 
   draw3DSector($img, $ox, $oy+20, $a, $b, $v, $sd, $ed, $colorArr[$i]);
   // Draw the label 
   imagefilledrectangle($img, 5, $ly, 5+$fw, $ly+$fh, $colorArr[$i]);
   imagerectangle($img, 5, $ly, 5+$fw, $ly+$fh, $clrt);
   // Chinese transcoding 
   $str = iconv("GB2312", "UTF-8", $labelArr[$i]);
   imagettftext($img, $font, 0, 5+2*$fw, $ly+13, $clrt, "D:/wamp/www/source/font/simhei.ttf", $str.":".$dataArr[$i]."(".(round(10000*($dataArr[$i]/$tot))/100)."%)");
   $ly += $fh+2;
  }
  // Draw picture titles 
  imagettftext($img, 15, 0, 5, 15, $clrt, "D:/wamp/www/source/font/simhei.ttf", iconv("GB2312", "UTF-8",$title));
  // Output graphics 
  header("Content-type: image/png");
  // Output the resulting image 
  $imgFileName = "./".time().".png";
  imagepng($img,$imgFileName);
  return $imgFileName;
 }
 /**
  *  draw 3d sector 
  */
 function draw3DSector($img, $ox, $oy, $a, $b, $v, $sd, $ed, $clr) {
  drawSector($img, $ox, $oy, $a, $b, $sd, $ed, $clr);
  if($sd<180){
   list($red, $green, $blue) = drawDarkColor($img, $clr);
   // Assign color to an image 
   $clr=imagecolorallocate($img, $red, $green, $blue);
   if($ed>180)
    $ed = 180;
   list($sx, $sy) = getExy($a,$b,$sd);
   $sx += $ox;
   $sy += $oy;
   list($ex, $ey) = getExy($a, $b, $ed);
   $ex += $ox;
   $ey += $oy;
   imageline($img, $sx, $sy, $sx, $sy+$v, $clr);
   imageline($img, $ex, $ey, $ex, $ey+$v, $clr);
   drawArc($img, $ox, $oy+$v, $a, $b, $sd, $ed, $clr);
   list($sx, $sy) = getExy($a, $b, ($sd+$ed)/2);
   $sy += $oy+$v/2;
   $sx += $ox;
   imagefill($img, $sx, $sy, $clr);
  }
 }
 /**
  *  Draw elliptic arc 
  */
 function drawArc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){
  $n = ANGLELENGTH >0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1;
  $d = $sd;
  list($x0,$y0) = getExy($a,$b,$d);
  for($i=0; $i<$n; $i++){
   $d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH);
   list($x, $y) = getExy($a, $b, $d);
   imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
   $x0 = $x;
   $y0 = $y;
  }
 }
 /**
  *  Draw a sectoral 
  */
 function drawSector($img, $ox, $oy, $a, $b, $sd, $ed, $clr) {
  $n = ANGLELENGTH > 0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1;
  $d = $sd;
  list($x0,$y0) = getExy($a, $b, $d);
  imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr);
  for($i=0; $i<$n; $i++) {
   $d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH);
   list($x, $y) = getExy($a, $b, $d);
   imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
   $x0 = $x;
   $y0 = $y;
  }
  imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr);
  list($x, $y) = getExy($a/2, $b/2, ($d+$sd)/2);
  imagefill($img, $x+$ox, $y+$oy, $clr);
 }
 /**
  *  According to the $clr Color gets the shadow color of the corresponding column 
  * @param $img   image 
  * @param $clr   color 
  * @return rgb Array of colors 
  */
 function drawDarkColor($img,$clr){
  $rgb = imagecolorsforindex($img,$clr);
  return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
 }
 /**
  *  O Angle $d Point coordinates on the corresponding ellipse 
  *
  * @param $a  abscissa 
  * @param $b  ordinate 
  * @param $d  The Angle 
  * @return  That corresponds to the elliptic point coordinates 
  */
 function getExy($a, $b, $d){
  $d = deg2rad($d);
  return array(round($a*cos($d)), round($b*sin($d)));
 }
 /**
  *  Assign images RGB The index color 
  */
 function drawIndexColor($img, $clr){
  $red = ($clr>>16) & 0xff;
  $green = ($clr>>8)& 0xff;
  $blue = ($clr) & 0xff;
  return imagecolorallocate($img, $red, $green, $blue);
 }
// Test the sample 
$title = " The distribution of animal species in zoos ";
$dataArr = array(20, 10, 20, 20, 10, 20, 30, 10); // Test data array 
$labelArr = array(" The elephant ", " The giraffe ", " The crocodile ", " An ostrich ", " The tiger ", " The lion ", " monkey ", " A zebra ");// The label 
$colorArr = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); // Corresponding color array 
$result = drawPieImg($title, $dataArr,$labelArr,$colorArr);
echo "<img src=".$result." mce_src=".$result.">";
?>


Related articles: