当前位置:Gxlcms > PHP教程 > PHPGD库动态生成折线图的实例代码

PHPGD库动态生成折线图的实例代码

时间:2021-07-01 10:21:17 帮助过:26人阅读

  1. /**

  2. * php GD库生成折线图、柱状图、饼状图
  3. * by bbs.it-home.org
  4. */
  5. $img_gao=170;
  6. $img_kuan=0;
  7. $jiange=30;//横坐标点与点之间的间隔,生成的图片宽度会根据传入数据的多少而自动变化
  8. $zuo=20;//左侧留空
  9. $you=20;//右侧留空
  10. $shang=20;//上留空
  11. $xia=20;//下留空
  12. $zuidashujuzhi=1;
  13. $p_x = array();//点横坐标
  14. $p_y = array();//点纵坐标
  15. $y_name=split(",",$_GET["x_name"]);
  16. if ($_GET["a"]=="") die("error id:0");
  17. $shuju=split(",",$_GET["a"]);
  18. //得到纵轴最大值
  19. for($i=0;$i  if(!is_numeric($shuju[$i])) die("error id:1");
  20.   if($shuju[$i]>$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];
  21. }
  22. //得到图像宽度
  23. $img_kuan=$zuo+$you+count($shuju)*$jiange;
  24. //然后创建图像资源
  25. $image = imagecreate($img_kuan,$img_gao);
  26. //灰色背景
  27. $white = imagecolorallocate($image, 0xEE, 0xEE, 0xEE);
  28. //坐标轴用黑色显示
  29. $zuobiao_yanse = imagecolorallocate($image, 0x00, 0x00, 0x00);
  30. //折线用蓝色显示
  31. $xian_yanse = imagecolorallocate($image, 0x00, 0x00, 0xFF);
  32. //画坐标
  33. //横轴
  34. imageline ( $image, $zuo, $img_gao-$xia, $img_kuan-$you/2, $img_gao-$xia, $zuobiao_yanse);
  35. //纵轴
  36. imageline ( $image, $zuo, $shang/2, $zuo, $img_gao-$xia, $zuobiao_yanse);
  37. //得到每个点的坐标
  38. for($i=0;$i  array_push ($p_x, $zuo+$i*$jiange);
  39.   array_push ($p_y, $shang+round(($img_gao-$shang-$xia)*(1-$shuju[$i]/$zuidashujuzhi)));
  40. }
  41. //纵轴刻度
  42. imageline ( $image, $zuo, $shang, $zuo+6, $shang, $zuobiao_yanse);
  43. imagestring ( $image, 1, $zuo/4, $shang,$zuidashujuzhi, $zuobiao_yanse);
  44. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*1/4, $zuo+6, $shang+($img_gao-$shang-$xia)*1/4, $zuobiao_yanse);
  45. imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*1/4,$zuidashujuzhi*3/4, $zuobiao_yanse);
  46. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*2/4, $zuo+6, $shang+($img_gao-$shang-$xia)*2/4, $zuobiao_yanse);
  47. imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*2/4,$zuidashujuzhi*2/4, $zuobiao_yanse);
  48. imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*3/4, $zuo+6, $shang+($img_gao-$shang-$xia)*3/4, $zuobiao_yanse);
  49. imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*3/4,$zuidashujuzhi*1/4, $zuobiao_yanse);
  50. //横轴刻度
  51. for($i=0;$i  imageline ( $image, $zuo+$i*$jiange, $img_gao-$xia, $zuo+$i*$jiange, $img_gao-$xia-6, $zuobiao_yanse);
  52.   imagestring ( $image, 1, $zuo+$i*$jiange-$jiange/4, $shang+($img_gao-$shang-$xia)+2,$y_name[$i], $zuobiao_yanse);
  53. }

  54. //折线

  55. $shuju_yanse_int=0;
  56. for($i=0;$i  if($i+1<>count($shuju)){
  57.     imageline ( $image, $p_x[$i], $p_y[$i], $p_x[$i+1], $p_y[$i+1], $xian_yanse);
  58.     imagefilledrectangle($image, $p_x[$i]-1, $p_y[$i]-1, $p_x[$i]+1, $p_y[$i]+1, $xian_yanse);
  59.   }
  60. }
  61. //上一个循环没有画出最后一个点效果,这里还要追加
  62. imagefilledrectangle($image, $p_x[count($shuju)-1]-1, $p_y[count($shuju)-1]-1, $p_x[count($shuju)-1]+1, $p_y[count($shuju)-1]+1, $xian_yanse);

  63. //标注数据值

  64. for($i=0;$i  imagestring ( $image, 3, $p_x[$i]+4, $p_y[$i]-12,$shuju[$i], $zuobiao_yanse);
  65. }
  66. //设定文件头
  67. header('Content-type: image/png');
  68. //输出图像
  69. imagepng($image);
  70. //释放资源
  71. imagedestroy($image);
  72. ?>

二,使用方法 在需要显示图像的位置插入以下代码:

说明: 其中a的值由自己计算得出; a的文本格式是由“,”连接的若干个数据的字符串,get方式传入。 由于往图形里写入中文需要更多PHP环境配置,这里给出一个html解决方案: 只需要根据数据个数的不同,动态生成一个表格放置横轴坐标刻度名称即可。

例子:

  1. for($i=0;$i<12;$i++) {
  2.   echo "
  3. ";
  4. }
  5. ?>
  6. ".$i."月

人气教程排行