打造超酷的PHP数据饼图

网络整理 - 07-26

打造超酷的PHP数据饼图



源代码:


PHP代码如下:


//+------------------------+ 
//| pie3dfun.PHP//公用函数 | 
//+------------------------+ 

define("ANGLE_STEP"5); //定义画椭圆弧时的角度步长 

function draw_getdarkcolor($img,$clr//求$clr对应的暗色 

$rgb imagecolorsforindex($img,$clr); 
return array(
$rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2); 


function 
draw_getexy($a$b$d//求角度$d对应的椭圆上的点坐标 

$d deg2rad($d); 
return array(
round($a*Cos($d)), round($b*Sin($d))); 


function 
draw_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr//椭圆弧函数 

$n ceil(($ed-$sd)/ANGLE_STEP); 
$d $sd
list(
$x0,$y0) = draw_getexy($a,$b,$d); 
for(
$i=0$i<$n$i++) 

$d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); 
list(
$x$y) = draw_getexy($a$b$d); 
imageline($img$x0+$ox$y0+$oy$x+$ox$y+$oy$clr); 
$x0 $x
$y0 $y



function 
draw_sector($img$ox$oy$a$b$sd$ed$clr//画扇面 

$n ceil(($ed-$sd)/ANGLE_STEP); 
$d $sd
list(
$x0,$y0) = draw_getexy($a$b$d); 
imageline($img$x0+$ox$y0+$oy$ox$oy$clr); 
for(
$i=0$i<$n$i++) 

$d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); 
list(
$x$y) = draw_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) = draw_getexy($a/2$b/2, ($d+$sd)/2); 
imagefill($img$x+$ox$y+$oy$clr); 


function 
draw_sector3d($img$ox$oy$a$b$v$sd$ed$clr//3d扇面 

draw_sector($img$ox$oy$a$b$sd$ed$clr); 
if(
$sd<180

list(
$R$G$B) = draw_getdarkcolor($img$clr); 
$clr=imagecolorallocate($img$R$G$B); 
if(
$ed>180$ed 180
list(
$sx$sy) = draw_getexy($a,$b,$sd); 
$sx += $ox
$sy += $oy
list(
$ex$ey) = draw_getexy($a$b$ed); 
$ex += $ox
$ey += $oy
imageline($img$sx$sy$sx$sy+$v$clr); 
imageline($img$ex$ey$ex$ey+$v$clr); 
draw_arc($img$ox$oy+$v$a$b$sd$ed$clr); 
list(
$sx$sy) = draw_getexy($a$b, ($sd+$ed)/2); 
$sy += $oy+$v/2
$sx += $ox
imagefill($img$sx$sy$clr); 

}
function 
draw_getindexcolor($img$clr//RBG转索引色 


$R = ($clr>>16) & 0xff
$G = ($clr>>8)& 0xff
$B = ($clr) & 0xff
return 
imagecolorallocate($img$R$G$B); 


// 绘图主函数,并输出图片 
// $datLst 为数据数组, $datLst 为标签数组, $datLst 为颜色数组 
// 以上三个数组的维数应该相等 
function draw_img($datLst,$labLst,$clrLst,$a=250,$b=120,$v=20,$font=10

$ox 5+$a
$oy 5+$b
$fw imagefontwidth($font); 
$fh imagefontheight($font); 

$n count($datLst);//数据项个数 

$w 10+$a*2
$h 10+$b*2+$v+($fh+2)*$n

$img imagecreate($w$h); 

//转RGB为索引色 
for($i=0$i<$n$i++) 
$clrLst[$i] = draw_getindexcolor($img,$clrLst[$i]); 

$clrbk imagecolorallocate($img0xff0xff0xff); 
$clrt imagecolorallocate($img0x000x000x00); 

//填充背景色 
imagefill($img00$clrbk); 

//求和 
$tot 0
for(
$i=0$i<$n$i++) 
$tot += $datLst[$i]; 
$sd 0
$ed 0333 
$ly 
10+$b*2+$v
for(
$i=0$i<$n$i++) 

$sd $ed
$ed += $datLst[$i]/$tot*360

//画圆饼 
draw_sector3d($img$ox$oy$a$b$v$sd$ed$clrLst[$i]); //$sd,$ed,$clrLst[$i]); 

//画标签 
imagefilledrectangle($img5$ly5+$fw$ly+$fh$clrLst[$i]); 
imagerectangle($img5$ly5+$fw$ly+$fh$clrt); 
//imagestring($img, $font, 5+2*$fw, $ly, $labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)", $clrt); 

$str iconv("GB2312""UTF-8"$labLst[$i]); 
ImageTTFText($img$font05+2*$fw$ly+13$clrt"./simsun.ttf"$str.":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)"); 
$ly += $fh+2


//输出图形 
header("Content-type: image/png"); 

//输出生成的图片 
$imgFileName "../temp/".time().".png"
imagepng($img,$imgFileName); 
echo 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 


$datLst = array(30, 10, 20, 20, 10, 20, 10, 20); //数据 
$labLst = array("中国科技大学", "安徽理工大学", "清华大学", "北京大学", "南京大学", "上海大学", "河海大学", "中山大学"); //标签 
$clrLst = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); 

//画图 
draw_img($datLst,$labLst,$clrLst); 
?>