php绘制饼状图的解决办法
内容摘要
这篇文章主要为大家详细介绍了php绘制饼状图的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!drawPieImg()函数包含8个
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!drawPieImg()函数包含8个
文章正文
这篇文章主要为大家详细介绍了php绘制饼状图的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
drawPieImg()函数包含8个参数,$title为饼状图的标题;$dataArr为需要显示的数据数组;$labelArr为对应数据的标签分类数组;$colorArr为对应数据的绘图颜色数组,这4个参数是必须的,对于不同的系统应用传递相应的参数即可。接下来的4个参数,负责设置要生成的饼状图的大小,如果不设置则使用系统默认值。程序按照床底数组数据的大小,从0度开始绘制,方向按照顺时针方向依次绘制对应数据占据的扇面大小。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | <code><?php /* php教程 www.512Pic.com */ //变量定义,画椭圆弧时的角度大小 define( "ANGLELENGTH" ,3); /** * 绘制图片 * @param $title 3D图的标题 * @param $dataArr 显示的数据数组 * @param $labelArr 对应数据的标签分类数组 * @param $colorArr 对应绘图颜色的数组 * @param $a 画布的基准宽度 * @param $b 画布的基准高度 * @param $v 3D柱的高度 * @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+ $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扇面 */ function draw3DSector( $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 ); } } /** * 绘制椭圆弧 */ function drawArc( $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 ; } } /** * 绘制扇面 */ function drawSector( $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 颜色 * @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 , $b , $d ){ $d = deg2rad ( $d ); return array ( round ( $a * cos ( $d )), round ( $b *sin( $d ))); } /** * 为图像分配RGB索引色 */ function drawIndexColor( $img , $clr ){ $red = ( $clr >>16) & 0xff; $green = ( $clr >>8)& 0xff; $blue = ( $clr ) & 0xff; return imagecolorallocate( $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 "<img src=" . $result . " mce_src=" . $result . ">" ; ?> </code> |
注:关于php绘制饼状图的简单示例的内容就先介绍到这里,更多相关文章的可以留意
代码注释