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.">";
?>