PHP 生成漂亮的统计表图

PHP的GD库很好很强大,最近在做数据统计的时候突然有想法想做成动态的统计图,以前BLOG发有几个FLASH统计图也很不错,但是既然这阵子研究起来PHP的图像处理,就试着弄个图片格式的统计图吧,先看效果:

是不是感觉还不错,呵呵,代码如下:拿去自己修改吧,链接数据库的代码就省略了,这里仅以字符串做演示:

柱状图:

PHP代码
  1. <?php   
  2. $a="200,120,400,200";   
  3. $b="BOJI,XZJZ,HSZH,LYBR";   
  4. ?>   
  5. <?   
  6. $kuan=50;//色柱宽   
  7. $jiange=40;//色柱间间隔   
  8. $zuo=40;//左侧留空   
  9. $you=40;//右侧留空   
  10. $shang=40;//上留空   
  11. $xia=30;//下留空   
  12. $zuidashujuzhi=1;//初始化纵轴最大数据值   
  13. if ($a=="") die("error id:a0");   
  14. if ($b=="") die("error id:b0");   
  15. $shuju=split(",",$a);   
  16. $lm=split(",",$b);   
  17. //得到最大值   
  18. for ($i=0;$i<count($shuju);$i++){   
  19. if(!is_numeric($shuju[$i])) die("error id:1");   
  20. if($shuju[$i]>$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];   
  21. }   
  22. //计算图像宽度   
  23. $img_kuan=600;//根据数据设定宽度用则改为$img_kuan=$zuo+$you+$jiange+count($shuju)*($jiange);   
  24. //图像高   
  25. $img_gao=250;   
  26. //存储色柱高度的数组   
  27. $zhugaodu = array();   
  28. $image = imagecreate($img_kuan,$img_gao);   
  29. $white = imagecolorallocate($image, 255, 255, 255);   
  30. //色柱颜色   
  31. $shuju_yanse =array(   
  32.      imagecolorallocate($image, 0x97, 0xbd, 0x00),   
  33.      imagecolorallocate($image, 0x00, 0x99, 0x00),   
  34.      imagecolorallocate($image, 0xcc, 0x33, 0x00),   
  35.      imagecolorallocate($image, 0xff, 0xcc, 0x00),   
  36.      imagecolorallocate($image, 0x33, 0x66, 0xcc),   
  37.      imagecolorallocate($image, 0x33, 0xcc, 0x33),   
  38.      imagecolorallocate($image, 0xff, 0x99, 0x33),   
  39.      imagecolorallocate($image, 0xcc, 0xcc, 0x99),   
  40.      imagecolorallocate($image, 0x99, 0xcc, 0x66),   
  41.      imagecolorallocate($image, 0x66, 0xff, 0x99)   
  42. );   
  43.   
  44. //坐标轴颜色   
  45. $zuobiao_yanse = imagecolorallocate($image, 120, 120, 120);   
  46. //横轴   
  47. imageline ( $image, $zuo, $img_gao-$xia, $img_kuan-$you/2, $img_gao-$xia, $zuobiao_yanse);   
  48. //纵轴   
  49. imageline ( $image, $zuo, $shang/2, $zuo, $img_gao-$xia, $zuobiao_yanse);   
  50.   
  51. //纵轴刻度,纵轴上共标注4个点,所以这里分别计算即可   
  52. imageline ( $image, $zuo, $shang, $zuo+6, $shang, $zuobiao_yanse);   
  53. imagestring ( $image, 3, $zuo/4, $shang,round($zuidashujuzhi), $zuobiao_yanse);   
  54. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*1/4, $zuo+6, round($shang+($img_gao-$shang-$xia)*1/4), $zuobiao_yanse);   
  55. imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*1/4,round($zuidashujuzhi*3/4), $zuobiao_yanse);   
  56. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*2/4, $zuo+6, $shang+($img_gao-$shang-$xia)*2/4, $zuobiao_yanse);   
  57. imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*2/4,round($zuidashujuzhi*2/4), $zuobiao_yanse);   
  58. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*3/4, $zuo+6, $shang+($img_gao-$shang-$xia)*3/4, $zuobiao_yanse);   
  59. imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*3/4,round($zuidashujuzhi*1/4), $zuobiao_yanse);   
  60.   
  61. //得到每个柱的高度   
  62. for($i=0;$i<count($shuju);$i++){   
  63.     array_push ($zhugaodu, round(($img_gao-$shang-$xia)*$shuju[$i]/$zuidashujuzhi));   
  64. }   
  65. //画数据柱   
  66. $shuju_yanse_int=0;   
  67. for($i=0;$i<count($shuju);$i++){   
  68. imagefilledrectangle( $image,$zuo+$jiange+$i*($kuan+$jiange),$shang+($img_gao-$shang-$xia)-$zhugaodu[$i],$zuo+$jiange+$i*($kuan+$jiange)+$kuan,($img_gao-$xia)-1 ,$shuju_yanse[$shuju_yanse_int]);   
  69. //因为只定义了10种颜色,所以这里做一个循环   
  70. if($shuju_yanse_int==9){   
  71.     $shuju_yanse_int=0;   
  72.      }else{   
  73.     $shuju_yanse_int++;   
  74.      }   
  75. }   
  76. //标注数据柱上方数据值   
  77. for($i=0;$i<count($shuju);$i++){   
  78.      imagestring ( $image, 2, $zuo+$jiange+$i*($kuan+$jiange)+2,$shang+($img_gao-$shang-$xia)-$zhugaodu[$i]-15,$shuju[$i]." R", $zuobiao_yanse);   
  79.      imagestring ( $image, 3, $zuo+$jiange+$i*($kuan+$jiange)+10,$img_gao-$shang+15,$lm[$i], $zuobiao_yanse);   
  80. }   
  81. header('Content-type: image/png');   
  82. imagepng($image);   
  83. imagedestroy($image);   
  84. ?>   

折线图:

PHP代码
  1. <?php   
  2. $a="200,120,400,200,340,500,450";   
  3. $b="Jan,Feb,Mar,Apr,May,Jue";   
  4. ?>   
  5. <?   
  6. $jiange=40;//折点间隔   
  7. $zuo=40;//左侧留空   
  8. $you=40;//右侧留空   
  9. $shang=40;//上留空   
  10. $xia=30;//下留空   
  11. $zuidashujuzhi=1;//初始化纵轴最大数据值   
  12. if ($a=="") die("error id:a0");   
  13. if ($b=="") die("error id:b0");   
  14. $shuju=split(",",$a);   
  15. $lm=split(",",$b);   
  16. //得到最大值   
  17. for ($i=0;$i<count($shuju);$i++){   
  18. if(!is_numeric($shuju[$i])) die("error id:1");   
  19. if($shuju[$i]>$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];   
  20. }   
  21. //计算图像宽度   
  22. $img_kuan=500;//根据数据设定宽度用则改为$img_kuan=$zuo+$you+$jiange+count($shuju)*($jiange);   
  23. //图像高   
  24. $img_gao=150;   
  25. //存储折点高度的数组   
  26. $zdgaodu = array();   
  27. $image = imagecreate($img_kuan,$img_gao);   
  28. $white = imagecolorallocate($image, 250, 250, 250);   
  29. //色柱颜色   
  30. $shuju_yanse =array(   
  31.      imagecolorallocate($image, 0x97, 0xbd, 0x00),   
  32.      imagecolorallocate($image, 0x00, 0x99, 0x00),   
  33.      imagecolorallocate($image, 0xcc, 0x33, 0x00),   
  34.      imagecolorallocate($image, 0xff, 0xcc, 0x00),   
  35.      imagecolorallocate($image, 0x33, 0x66, 0xcc),   
  36.      imagecolorallocate($image, 0x33, 0xcc, 0x33),   
  37.      imagecolorallocate($image, 0xff, 0x99, 0x33),   
  38.      imagecolorallocate($image, 0xcc, 0xcc, 0x99),   
  39.      imagecolorallocate($image, 0x99, 0xcc, 0x66),   
  40.      imagecolorallocate($image, 0x66, 0xff, 0x99)   
  41. );   
  42. //虚线颜色   
  43. $xuyanse = imagecolorallocate($image, 230, 230, 230);   
  44. //坐标轴颜色   
  45. $zuobiao_yanse = imagecolorallocate($image, 0x00, 0x00, 0x00);   
  46. //横轴   
  47. imageline ( $image, $zuo, $img_gao-$xia, $img_kuan-$you/2, $img_gao-$xia, $zuobiao_yanse);   
  48. //纵轴   
  49. imageline ( $image, $zuo, $shang/2, $zuo, $img_gao-$xia, $zuobiao_yanse);   
  50.   
  51. //纵轴刻度,纵轴上共标注4个点,所以这里分别计算即可   
  52. imageline ( $image, $zuo, $shang, $zuo+6, $shang, $zuobiao_yanse);   
  53. imagestring ( $image, 3, $zuo/4, $shang,round($zuidashujuzhi), $zuobiao_yanse);   
  54. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*1/4, $zuo+6, round($shang+($img_gao-$shang-$xia)*1/4), $zuobiao_yanse);   
  55. imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*1/4,round($zuidashujuzhi*3/4), $zuobiao_yanse);   
  56. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*2/4, $zuo+6, $shang+($img_gao-$shang-$xia)*2/4, $zuobiao_yanse);   
  57. imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*2/4,round($zuidashujuzhi*2/4), $zuobiao_yanse);   
  58. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*3/4, $zuo+6, $shang+($img_gao-$shang-$xia)*3/4, $zuobiao_yanse);   
  59. imagestring ( $image, 3, $zuo/4, $shang+($img_gao-$shang-$xia)*3/4,round($zuidashujuzhi*1/4), $zuobiao_yanse);   
  60.   
  61. //得到每个折点的高度   
  62. for($i=0;$i<count($shuju);$i++){   
  63.     array_push ($zdgaodu, round($img_gao-($img_gao-$shang-$xia)*$shuju[$i]/$zuidashujuzhi));   
  64. }   
  65. //创建折线图   
  66. for ($i=0; $i<count($shuju)-1; $i++){   
  67. imageline($image, $zuo+$i*$jiange, $zdgaodu[$i]-$xia, $zuo+($i+1)*$jiange, $zdgaodu[$i+1]-$xia, $shuju_yanse);   
  68. }   
  69. //创建虚线   
  70. for ($i=1; $i<count($shuju)-1; $i++){   
  71. imageline($image, $zuo+$i*$jiange, $zdgaodu[$i]-$xia+2, $zuo+$i*$jiange, $img_gao-$xia-2, $xuyanse);   
  72. }   
  73. //标注数据值   
  74. for($i=0;$i<count($shuju);$i++){   
  75.      imagestring ( $image, 2, $zuo+$i*$jiange+2,$zdgaodu[$i]-$xia-15,$shuju[$i], $zuobiao_yanse);   
  76.      imagestring ( $image, 3, $zuo+$i*$jiange,$img_gao-$shang+15,$lm[$i], $zuobiao_yanse);   
  77. }   
  78. header('Content-type: image/png');   
  79. imagepng($image);   
  80. imagedestroy($image);   
  81. ?>   

设想一下,在统计数据库的某项数据的时候,如果动态的生成这样直观而又美观的的统计图表,是个不错的想法。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值