The drawPieImg() function contains 8 parameters. $title is the title of the pie chart; $dataArr is the data array that needs to be displayed; $labelArr is the label classification array of the corresponding data; $colorArr is the drawing color array of the corresponding data. These 4 Parameters are required, just pass the corresponding parameters for different system applications. The next four parameters are responsible for setting the size of the pie chart to be generated. If not set, the system default value will be used. The program starts drawing from 0 degrees according to the size of the array data at the bottom of the bed, and draws the sector size occupied by the corresponding data in a clockwise direction.
//Variable definition, the angle size when drawing an elliptical arc
define("ANGLELENGTH",3);
/**
* Draw the picture
* @param $title The title of the 3D picture
* @param $dataArr The displayed data array
* @param $labelArr The label classification array of the corresponding data
* @param $colorArr The array corresponding to the drawing color
* @param $a The base width of the canvas
* @param $b The base height of the canvas
* @param $v The height of the 3D column
* @param $ font font size
* @return successfully drawn 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 the array length
$w = 10+$a*2;
$h = 10+$b*2+$v+($fh+2)*$n;
//Create artboard
$img = imagecreate($w, $h);
//Convert RGB to index color
for($i=0; $i<$n; $i++)
$colorArr[$i] = drawIndexColor ($img,$colorArr[$i]);//Assign color to image $img
$clrbk = imagecolorallocate($img, 0xff, 0xff, 0xff);
$clrt = imagecolorallocate($img, 0x00 , 0x00, 0x00);
//Fill the background color
imagefill($img, 0, 0, $clrbk);
//Sum
$tot = 0;
for( $i=0; $i<$n; $i++)
$tot += $dataArr[$i];
//The starting 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 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 image title
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 generated 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 a color to the 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 elliptical 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 the sector
*/
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);
}
/**
* Get the shadow color of the corresponding column based on $clr color
* @param $img Image
* @param $clr Color
* @return rgb color array
*/
function drawDarkColor($img,$clr){
$rgb = imagecolorsforindex($img,$clr);
return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}
/**
* Find the coordinates of the point on the ellipse corresponding to angle $d
*
* @param $a Abscissa
* @param $b Vertical coordinate
* @param $d Angle
* @return Corresponding ellipse point coordinates
*/
function getExy($a, $b, $d){
$d = deg2rad($d);
return array(round($a*cos($d)), round($b*sin($d)));
}
/**
* Assign RGB index color to image
*/
function drawIndexColor($img, $clr){
$red = ($clr>>16) & 0xff;
$green = ($clr>>8)& 0xff;
$blue = ($clr) & 0xff;
return imagecolorallocate($img, $red, $green, $blue);
}
//测试示例
$title = "动物园动物种类分布情况";
$dataArr = array(20, 10, 20, 20, 10, 20, 30, 10); //测试数据数组
$labelArr = array("大象", "长颈鹿", "鳄鱼", "鸵鸟", "老虎", "狮子", "猴子", "斑马");//标签
$colorArr = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); //对应颜色数组
$result = drawPieImg($title, $dataArr,$labelArr,$colorArr);
echo "
";
?>