Heim  >  Artikel  >  Backend-Entwicklung  >  php绘制饼状图的代码举例

php绘制饼状图的代码举例

WBOY
WBOYOriginal
2016-07-25 08:59:061421Durchsuche
  1. //变量定义,画椭圆弧时的角度大小
  2. define("ANGLELENGTH",3);
  3. /**
  4. * 绘制图片
  5. * @param $title 3D图的标题
  6. * @param $dataArr 显示的数据数组
  7. * @param $labelArr 对应数据的标签分类数组
  8. * @param $colorArr 对应绘图颜色的数组
  9. * @param $a 画布的基准宽度
  10. * @param $b 画布的基准高度
  11. * @param $v 3D柱的高度
  12. * @param $font 字体大小
  13. * @return 绘制成功的图片访问路径
  14. */
  15. function drawPieImg($title, $dataArr, $labelArr, $colorArr, $a=250, $b=120, $v=20, $font=10){
  16. $ox = 5+$a;
  17. $oy = 5+$b;
  18. $fw = imagefontwidth($font);
  19. $fh = imagefontheight($font);
  20. $n = count($dataArr);//计算数组长度
  21. $w = 10+$a*2;
  22. $h = 10+$b*2+$v+($fh+2)*$n;
  23. //创建画板
  24. $img = imagecreate($w, $h);
  25. //转RGB为索引色
  26. for($i=0; $i$colorArr[$i] = drawIndexColor($img,$colorArr[$i]);//为图像$img分配颜色
  27. $clrbk = imagecolorallocate($img, 0xff, 0xff, 0xff);
  28. $clrt = imagecolorallocate($img, 0x00, 0x00, 0x00);
  29. //填充背景色
  30. imagefill($img, 0, 0, $clrbk);
  31. //求和
  32. $tot = 0;
  33. for($i=0; $i$tot += $dataArr[$i];
  34. //每个分类的起始角度大小
  35. $sd = 0;
  36. //每个分类所占据的角度大小
  37. $ed = 0;
  38. $ly = 10+$b*2+$v;
  39. for($i=0; $i$sd = $ed;
  40. $ed += $dataArr[$i]/$tot*360;
  41. //画3d扇面
  42. draw3DSector($img, $ox, $oy+20, $a, $b, $v, $sd, $ed, $colorArr[$i]);
  43. //画标签
  44. imagefilledrectangle($img, 5, $ly, 5+$fw, $ly+$fh, $colorArr[$i]);
  45. imagerectangle($img, 5, $ly, 5+$fw, $ly+$fh, $clrt);
  46. //中文转码
  47. $str = iconv("GB2312", "UTF-8", $labelArr[$i]);
  48. 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)."%)");
  49. $ly += $fh+2;
  50. }
  51. //绘制图片标题
  52. imagettftext($img, 15, 0, 5, 15, $clrt, "D:/wamp/www/source/font/simhei.ttf", iconv("GB2312", "UTF-8",$title));
  53. //输出图形
  54. header("Content-type: image/png");
  55. //输出生成的图片
  56. $imgFileName = "./".time().".png";
  57. imagepng($img,$imgFileName);
  58. return $imgFileName;
  59. }
  60. /**
  61. * 绘制3d扇面
  62. */
  63. function draw3DSector($img, $ox, $oy, $a, $b, $v, $sd, $ed, $clr) {
  64. drawSector($img, $ox, $oy, $a, $b, $sd, $ed, $clr);
  65. if($sdlist($red, $green, $blue) = drawDarkColor($img, $clr);
  66. //为图像分配颜色
  67. $clr=imagecolorallocate($img, $red, $green, $blue);
  68. if($ed>180)
  69. $ed = 180;
  70. list($sx, $sy) = getExy($a,$b,$sd);
  71. $sx += $ox;
  72. $sy += $oy;
  73. list($ex, $ey) = getExy($a, $b, $ed);
  74. $ex += $ox;
  75. $ey += $oy;
  76. imageline($img, $sx, $sy, $sx, $sy+$v, $clr);
  77. imageline($img, $ex, $ey, $ex, $ey+$v, $clr);
  78. drawArc($img, $ox, $oy+$v, $a, $b, $sd, $ed, $clr);
  79. list($sx, $sy) = getExy($a, $b, ($sd+$ed)/2);
  80. $sy += $oy+$v/2;
  81. $sx += $ox;
  82. imagefill($img, $sx, $sy, $clr);
  83. }
  84. }
  85. /**
  86. * 绘制椭圆弧
  87. */
  88. function drawArc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){
  89. $n = ANGLELENGTH >0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1;
  90. $d = $sd;
  91. list($x0,$y0) = getExy($a,$b,$d);
  92. for($i=0; $i$d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH);
  93. list($x, $y) = getExy($a, $b, $d);
  94. imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
  95. $x0 = $x;
  96. $y0 = $y;
  97. }
  98. }
  99. /**
  100. * 绘制扇面
  101. */
  102. function drawSector($img, $ox, $oy, $a, $b, $sd, $ed, $clr) {
  103. $n = ANGLELENGTH > 0 ? ceil(($ed-$sd)/ANGLELENGTH) : -1;
  104. $d = $sd;
  105. list($x0,$y0) = getExy($a, $b, $d);
  106. imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr);
  107. for($i=0; $i$d = ($d+ANGLELENGTH)>$ed?$ed:($d+ANGLELENGTH);
  108. list($x, $y) = getExy($a, $b, $d);
  109. imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
  110. $x0 = $x;
  111. $y0 = $y;
  112. }
  113. imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr);
  114. list($x, $y) = getExy($a/2, $b/2, ($d+$sd)/2);
  115. imagefill($img, $x+$ox, $y+$oy, $clr);
  116. }
  117. /**
  118. * 根据$clr颜色获取对应的柱的阴影色
  119. * @param $img 图像
  120. * @param $clr 颜色
  121. * @return rgb颜色数组
  122. */
  123. function drawDarkColor($img,$clr){
  124. $rgb = imagecolorsforindex($img,$clr);
  125. return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
  126. }
  127. /**
  128. * 求角度$d对应的椭圆上的点坐标
  129. *
  130. * @param $a 横坐标
  131. * @param $b 纵坐标
  132. * @param $d 角度
  133. * @return 对应椭圆点坐标
  134. */
  135. function getExy($a, $b, $d){
  136. $d = deg2rad($d);
  137. return array(round($a*cos($d)), round($b*sin($d)));
  138. }
  139. /**
  140. * 为图像分配RGB索引色
  141. */
  142. function drawIndexColor($img, $clr){
  143. $red = ($clr>>16) & 0xff;
  144. $green = ($clr>>8)& 0xff;
  145. $blue = ($clr) & 0xff;
  146. return imagecolorallocate($img, $red, $green, $blue);
  147. }
  148. //测试示例
  149. $title = "动物园动物种类分布情况";
  150. $dataArr = array(20, 10, 20, 20, 10, 20, 30, 10); //测试数据数组
  151. $labelArr = array("大象", "长颈鹿", "鳄鱼", "鸵鸟", "老虎", "狮子", "猴子", "斑马");//标签
  152. $colorArr = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); //对应颜色数组
  153. $result = drawPieImg($title, $dataArr,$labelArr,$colorArr);
  154. echo "php绘制饼状图的代码举例 ";
  155. ?>
复制代码

代码说明: drawPieImg()函数包含8个参数,$title为饼状图的标题;$dataArr为需要显示的数据数组;$labelArr为对应数据的标签分类数组;$colorArr为对应数据的绘图颜色数组,这4个参数是必须的,对于不同的系统应用传递相应的参数即可。

其余4个参数,负责设置要生成的饼状图的大小,如果不设置则使用系统默认值。程序按照床底数组数据的大小,从0度开始绘制,方向按照顺时针方向依次绘制对应数据占据的扇面大小。

有兴趣的朋友,动手测试下以上的代码吧,看看绘出的饼状图效果如何呢?!



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn