欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-04-16 08:07:48
...
  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+1count($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. ?>
复制代码

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

  1. PHP GD库动态生成折线图的实例代码
复制代码

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

例子:

  1. for($i=0;$i  echo "
  2. ";
  3. }
  4. ?>
  5. ".$i."月
复制代码