微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

利用php绘制饼状图的实现代码

drawPieImg()函数包含8个参数,$title为饼状图的标题;$dataArr为需要显示的数据数组;$labelArr为对应数据的标签分类数组;$colorArr为对应数据的绘图颜色数组,这4个参数是必须的,对于不同的系统应用传递相应的参数即可。接下来的4个参数,负责设置要生成的饼状图的大小,如果不设置则使用系统认值。程序按照床底数组数据的大小,从0度开始绘制,方向按照顺时针方向依次绘制对应数据占据的扇面大小。
<div class="codetitle"><a style="CURSOR: pointer" data="91679" class="copybut" id="copybut91679" onclick="doCopy('code91679')"> 代码如下:

<div class="codebody" id="code91679">
<?PHP
//变量定义,画椭圆弧时的角度大小
define("ANGLELENGTH",3);
/
绘制图片
@param $title3D图的标题
@param $dataArr显示的数据数组
@param $labelArr对应数据的标签分类数组
@param $colorArr对应绘图颜色的数组
@param $a画布的基准宽度
@param $b画布的基准高度
@param $v3D柱的高度
@param $font字体大小
@return 绘制成功的图片访问路径
/
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);//计算数组长度
$w = 10+$a
2;
$h = 10+$b2+$v+($fh+2)$n;
//创建画板
$img = imagecreate($w,$h);
//转RGB为索引色
for($i=0; $i<$n; $i++)
$colorArr[$i] = drawIndexColor($img,$colorArr[$i]);//为图像$img分配颜色
$clrbk = imagecolorallocate($img,0xff,0xff);
$clrt = imagecolorallocate($img,0x00,0x00);
//填充背景色
imagefill($img,$clrbk);
//求和
$tot = 0;
for($i=0; $i<$n; $i++)
$tot += $dataArr[$i];
//每个分类的起始角度大小
$sd = 0;
//每个分类所占据的角度大小
$ed = 0;
$ly = 10+$b2+$v;
for($i=0; $i<$n; $i++){
$sd = $ed;
$ed += $dataArr[$i]/$tot
360;
//画3d扇面
draw3DSector($img,$ox,$oy+20,$a,$b,$v,$sd,$ed,$colorArr[$i]);
//画标签
imagefilledrectangle($img,5,$ly,5+$fw,$ly+$fh,$colorArr[$i]);
imagerectangle($img,$clrt);
//中文转码
$str = iconv("GB2312","UTF-8",$labelArr[$i]);
imagettftext($img,$font,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;
}
//绘制图片标题
imagettftext($img,15,iconv("GB2312",$title));
//输出图形
header("Content-type: image/png");
//输出生成图片
$imgFileName = "./".time().".png";
imagepng($img,$imgFileName);
return $imgFileName;
}
/

绘制3d扇面
/
function draw3DSector($img,$oy,$clr) {
drawSector($img,$clr);
if($sd<180){
list($red,$green,$blue) = drawDarkColor($img,$clr);
//为图像分配颜色
$clr=imagecolorallocate($img,$red,$blue);
if($ed>180)
$ed = 180;
list($sx,$sy) = getExy($a,$sd);
$sx += $ox;
$sy += $oy;
list($ex,$ey) = getExy($a,$ed);
$ex += $ox;
$ey += $oy;
imageline($img,$sx,$sy,$sy+$v,$clr);
imageline($img,$ex,$ey,$ey+$v,$clr);
drawArc($img,$oy+$v,$clr);
list($sx,($sd+$ed)/2);
$sy += $oy+$v/2;
$sx += $ox;
imagefill($img,$clr);
}
}
/
绘制椭圆弧
/
function drawArc($img,$clr){
$n = ANGLELENGTH >0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1;
$d = $sd;
list($x0,$y0) = getExy($a,$d);
for($i=0; $i<$n; $i++){
$d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH);
list($x,$y) = getExy($a,$d);
imageline($img,$x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr);
$x0 = $x;
$y0 = $y;
}
}
/

绘制扇面
/
function drawSector($img,$clr) {
$n = ANGLELENGTH > 0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1;
$d = $sd;
list($x0,$clr);
for($i=0; $i<$n; $i++) {
$d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH);
list($x,$clr);
$x0 = $x;
$y0 = $y;
}
imageline($img,$clr);
list($x,$y) = getExy($a/2,$b/2,($d+$sd)/2);
imagefill($img,$clr);
}
/
根据$clr颜色获取对应的柱的阴影色
@param $img图像
@param $clr颜色
@return rgb颜色数组
*/
function drawDarkColor($img,$clr){
$rgb = imagecolorsforindex($img,$clr);
return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}
/*
求角度$d对应的椭圆上的点坐标

@param $a横坐标
@param $b纵坐标
@param $d角度
@return 对应椭圆点坐标
/
function getExy($a,$d){
$d = deg2rad($d);
return array(round($acos($d)),round($bsin($d)));
}
/

为图像分配RGB索引色
/
function drawIndexColor($img,$clr){
$red = ($clr>>16) & 0xff;
$green = ($clr>>8)& 0xff;
$blue = ($clr) & 0xff;
return imagecolorallocate($img,$blue);
}
//测试示例
$title = "动物园动物种类分布情况";
$dataArr = array(20,10,20,30,10); //测试数据数组
$labelArr = array("大象","长颈鹿","鳄鱼","鸵鸟","老虎","狮子","猴子","斑马");//标签
$colorArr = array(0x99ff00,0xff6666,0x0099ff,0xff99ff,0xffff99,0x99ffff,0xff3333,0x009999); //对应颜色数组
$result = drawPieImg($title,$colorArr);
echo "<img src=".$result." mce_src=".$result.">";
?>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐