php中用GD绘制饼图,绘制的类见代码:
1ClassChart{2PRivate$image;//定义图像3private$title;//定义标题4private$ydata;//定义Y轴数据5private$xdata;//定义X轴数据6private$color;//定义条形图颜色7private$bgcolor;//定义图片背景颜色8private$width;//定义图片的宽9private$height;//定义图片的长1011/*12* 构造函数13* String title 图片标题14* Array xdata 索引数组,X轴数据15* Array ydata 索引数组,数字数组,Y轴数据16*/17function__construct($title,$xdata,$ydata) {18$this->title =$title;19$this->xdata =$xdata;20$this->ydata =$ydata;21$this->color =array('#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4');22}2324/*25* 公有方法,设置条形图的颜色26* Array color 颜色数组,元素取值为'#058DC7'这种形式27*/28functionsetBarColor($color){29$this->color =$color;30}3132/*33* 绘制饼图34*/35functionmkPieChart() {36$sum=array_sum($this->ydata);//获取ydata所有元素之和37$start= 0;//弧的开始角度38$end= 0;//弧的结束角度39$pieWidth= 300;//椭圆的长轴40$pieHeight= 220;//椭圆的短轴41$space= 40;//椭圆与小矩形的间距42$margin= 20;//图片的边距43$recWidth= 20;//小矩形的宽44$recHeight= 15;//小矩形的高45$titleHeight= 50;//标题区域的高46// 图片自适应宽与高47$this->width =$pieWidth+$this->arrayLengthMax($this->xdata)*10*4/3 +$space+$recWidth+$margin;48$this->height = (($pieHeight>count($this->xdata)*25 ) ?$pieHeight:count($this->xdata)*25) +$titleHeight;49//椭圆中心的坐标50$cx=$pieWidth/2+$margin;51$cy=$pieHeight/2+$titleHeight;5253$this->image = imagecreatetruecolor($this->width ,$this->height);//准备画布54$this->bgcolor = imagecolorallocate($this->image,255,255,255);//图片的背景颜色55imagefill($this->image,0,0,$this->bgcolor);//填充背景5657// 设置条形图的颜色58$color=array();59foreach($this->coloras$col) {60$col=substr($col,1,strlen($col)-1);61$red=hexdec(substr($col,0,2));62$green=hexdec(substr($col,2,2));63$blue=hexdec(substr($col,4,2));64$color[] = imagecolorallocate($this->image ,$red,$green,$blue);65}6667//设置线段的颜色、字体的颜色、字体的路径68$lineColor= imagecolorallocate($this->image ,0xcc,0xcc,0xcc);69$fontColor= imagecolorallocate($this->image, 0x95,0x8f,0x8f);70$fontPath= 'font/simsun.ttc';7172//绘制扇形弧73for($i= 0;$i< 10;$i++) {74foreach($this->ydataas$key=>$val) {75$end+= 360*$val/$sum;76imagefilledarc($this->image,$cx,$cy-$i,$pieWidth,$pieHeight,$start,$end,$color[$key%count($this->color)],IMG_ARC_PIE);77$start=$end;78}79}8081//绘制小矩形及之后文字说明82$x1=$pieWidth+$space;83$y1=$titleHeight;84foreach($this->ydataas$key=>$val) {85imagefilledrectangle($this->image,$x1,$y1,$x1+$recWidth,$y1+$recHeight,$color[$key%count($this->color)]);86imagettftext($this->image,10,0,$x1+$recWidth+5,$y1+$recHeight-2,$fontColor,$fontPath,$this->xdata[$key]);87$y1+=$recHeight+ 10;88}8990//绘画标题91$titleStart= ($this->width - 5.5*strlen($this->title))/2;92imagettftext($this->image,11,0,$titleStart,20,$fontColor,$fontPath,$this->title);9394//输出图片95header("Content-Type:image/png");96imagepng($this->image);97}9899/*100* 私有方法,求数组中元素长度最大的值101* Array arr 字符串数组,必须是汉字102*/103privatefunctionarrayLengthMax($arr) {104$length= 0;105foreach($arras$val) {106$length=strlen($val) >$length?strlen($val) :$length;107}108return$length/3;109}110111//析构函数112function__destruct(){113imagedestroy($this->image);114}115}
测试代码如下:
1$xdata=array('测试一','测试二','测试三','测试四','测试五','测试六','测试七','测试八','测试九');2$ydata=array(89,90,90,23,35,45,56,23,56);3$Img=newChart($title,$xdata,$ydata);4$Img->mkPieChart();
效果图如下: