好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php生成饼图效果的实现代码

生成饼图很多代码都可以实现,今天我们介绍的这个实例是基于php gd库的一种生成统计数据的饼图效果,有需要的同学可以参考一下,代码如下:

<?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( $img , 0xff, 0xff, 0xff);   $clrt  = imagecolorallocate( $img , 0x00, 0x00, 0x00);   //填充背景色    imagefill( $img , 0, 0,  $clrbk );   //求和    $tot  = 0;   for ( $i =0;  $i < $n ;  $i ++)   $tot  +=  $datLst [ $i ];   $sd  = 0;   $ed  = 0; 333   $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( $img , 5,  $ly , 5+ $fw ,  $ly + $fh ,  $clrLst [ $i ]);   imagerectangle( $img , 5,  $ly , 5+ $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 ,  $font , 0, 5+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   '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '   }  //开源代码phpfensi.com   $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 );   ?> 

 

 

查看更多关于php生成饼图效果的实现代码的详细内容...

  阅读:75次