利用php绘制饼状图的实现代码
2023-06-13 09:15:01 时间
drawPieImg()函数包含8个参数,$title为饼状图的标题;$dataArr为需要显示的数据数组;$labelArr为对应数据的标签分类数组;$colorArr为对应数据的绘图颜色数组,这4个参数是必须的,对于不同的系统应用传递相应的参数即可。接下来的4个参数,负责设置要生成的饼状图的大小,如果不设置则使用系统默认值。程序按照床底数组数据的大小,从0度开始绘制,方向按照顺时针方向依次绘制对应数据占据的扇面大小。
复制代码代码如下:
<?php
//变量定义,画椭圆弧时的角度大小
define("ANGLELENGTH",3);
/**
*绘制图片
*@param$title 3D图的标题
*@param$dataArr 显示的数据数组
*@param$labelArr 对应数据的标签分类数组
*@param$colorArr 对应绘图颜色的数组
*@param$a 画布的基准宽度
*@param$b 画布的基准高度
*@param$v 3D柱的高度
*@param$font 字体大小
*@return 绘制成功的图片访问路径
*/
functiondrawPieImg($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+$b*2+$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,0xff);
$clrt=imagecolorallocate($img,0x00,0x00,0x00);
//填充背景色
imagefill($img,0,0,$clrbk);
//求和
$tot=0;
for($i=0;$i<$n;$i++)
$tot+=$dataArr[$i];
//每个分类的起始角度大小
$sd=0;
//每个分类所占据的角度大小
$ed=0;
$ly=10+$b*2+$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,5,$ly,5+$fw,$ly+$fh,$clrt);
//中文转码
$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;
}
//绘制图片标题
imagettftext($img,15,0,5,15,$clrt,"D:/wamp/www/source/font/simhei.ttf",iconv("GB2312","UTF-8",$title));
//输出图形
header("Content-type:image/png");
//输出生成的图片
$imgFileName="./".time().".png";
imagepng($img,$imgFileName);
return$imgFileName;
}
/**
*绘制3d扇面
*/
functiondraw3DSector($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);
//为图像分配颜色
$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);
}
}
/**
*绘制椭圆弧
*/
functiondrawArc($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;
}
}
/**
*绘制扇面
*/
functiondrawSector($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);
}
/**
*根据$clr颜色获取对应的柱的阴影色
*@param$img 图像
*@param$clr 颜色
*@returnrgb颜色数组
*/
functiondrawDarkColor($img,$clr){
$rgb=imagecolorsforindex($img,$clr);
returnarray($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}
/**
*求角度$d对应的椭圆上的点坐标
*
*@param$a 横坐标
*@param$b 纵坐标
*@param$d 角度
*@return对应椭圆点坐标
*/
functiongetExy($a,$b,$d){
$d=deg2rad($d);
returnarray(round($a*cos($d)),round($b*sin($d)));
}
/**
*为图像分配RGB索引色
*/
functiondrawIndexColor($img,$clr){
$red=($clr>>16)&0xff;
$green=($clr>>8)&0xff;
$blue=($clr)&0xff;
returnimagecolorallocate($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"<imgsrc=".$result."mce_src=".$result.">";
?>
相关文章
- PHP开启MySQL扩展的必要性(php开启mysql扩展)
- PHP实现将数组插入MySQL数据库(php数组插入mysql)
- 开发Linux下PHP模块开发:实现程序性能最大化(linux下php模块)
- PHP如何使用Redis连接: 代码实例(php连接redis代码)
- PHP和MySQL配合使用的优雅代码写作技巧(phpmysql代码)
- 使用PHP连接MySQL数据库实现数据操作(php连接mysql类)
- MySQL与PHP的连接:实现快速数据库访问(mysql连接php)
- 善数据库性能用PHP连接MSSQL提升数据库性能(php连接mssql改)
- PHP与MSSQL结合,提高数据查询效率(php能连mssql)
- 使用Redis需要PHP版本满足特定要求(redis需要php版本)
- Redis实现PHP限流策略(redis限流php)
- 简单示例AJAX结合PHP代码实现登录效果代码
- 利用discuz实现PHP大文件上传应用实例代码
- PHP多线程抓取网页实现代码
- PHP安全技术之实现php基本安全
- paypal即时到账php实现代码
- php实现无限级分类实现代码(递归方法)
- php获取全局变量的代码
- php小型企业库存管理系统的设计与实现代码
- php下利用curl判断远程文件是否存在的实现代码
- php获取百度的热词数据的代码
- php递归创建和删除文件夹的代码小结
- PHP实现提取一个图像文件并在浏览器上显示的代码
- php定义404页面的实现代码
- PHP数组无限分级数据的层级化处理代码
- php数组去重的函数代码
- PHP获取MSN好友列表类的实现代码
- php实现查询百度google收录情况(示例代码)
- php中用socket模拟http中post或者get提交数据的示例代码
- php与java通过socket通信的实现代码
- php对二维数组按指定键值key排序示例代码
- PHP运行SVN命令显示某用户的文件更新记录的代码
- PHP获取php,mysql,apche的版本信息示例代码
- 简单的php中文转拼音的实现代码
- 一个简单的PHP验证码实现代码
- php导出csv格式数据并将数字转换成文本的思路以及代码分享