PHP实现的曲线统计图表示例


Posted in PHP onNovember 10, 2016

本文实例讲述了PHP实现的曲线统计图表。分享给大家供大家参考,具体如下:

<?php
/******************************
*      折线图生成函数
*      youd
*      090207-01
******************************/
function line_stats_pic($value_y,$width,$high,$strong=1,$fix=0){
//y值处理函数
function line_point_y($num,$width,$high,$max_num_add,$min_num_add,$y_pxdensity){
  $return=$high-floor(($num-$min_num_add+$y_pxdensity)/(($max_num_add-$min_num_add)/$high));
  return $return;
}
//参数处理
$allnum=sizeof($value_y);
$max_num=max($value_y);              //最大值
$min_num=min($value_y);              //最小值
$limit_m=$max_num-$min_num;            //极差
$max_num_add=$max_num+$limit_m*0.1;        //轴最大值
$min_num_add=$min_num-$limit_m*0.1;        //轴最小值
$limit=$max_num_add-$min_num_add;         //极差-坐标轴y
$y_pxdensity=($max_num_add-$min_num_add)/$high;  //y轴密度
$x_pxdensity=floor($width/$allnum);        //x轴密度
reset($value_y);                 //将数组指针归零
$i=0;
foreach($value_y as $val){
  $point_y[$i]=line_point_y($val,$width,$high,$max_num_add,$min_num_add,$y_pxdensity);
  $i++;
}
$zero_y=line_point_y(0,$width,$high,$max_num_add,$min_num_add,$y_pxdensity);  //零点的y值
$empty_size_x=(strlen($max_num) > strlen($min_num) ? strlen($max_num) : strlen($min_num))*5+3;          //左边空白
//图片流开始
header("Content-type:image/png");
$pic=imagecreate($width+$empty_size_x+10,$high+13);
imagecolorallocate($pic,255,255,255);     //背景色
$color_1=imagecolorallocate($pic,30,144,255); //线条色
$color_2=imagecolorallocate($pic,0,0,0);   //黑色
$color_3=imagecolorallocate($pic,194,194,194);//灰色
//绘制网格
imagesetthickness($pic,1);          //网格线宽
$y_line_width=floor($width/100);       //纵网格线数目
$y_line_density=$y_line_width==0 ? 0 :floor($width/$y_line_width); //纵网格线密度
$point_zero_y=$zero_y > $high ? $high : $zero_y;
imagestring($pic,1,$empty_size_x-1,$high+4,"0",$color_2); //零点数轴标记
for($i=1;$i <= $y_line_width;$i++){      //绘制纵网格线
  imagesetthickness($pic,1);         //网格线宽
  imageline($pic,$y_line_density*$i+$empty_size_x,0,$y_line_density*$i+$empty_size_x,$high,$color_3);
  imagesetthickness($pic,2);         //轴点线宽
  imageline($pic,$y_line_density*$i+$empty_size_x,$point_zero_y-4,$y_line_density*$i+$empty_size_x,$point_zero_y,$color_2);
  imagestring($pic,1,100*$i+$empty_size_x-5,$high+4,$allnum/$y_line_width*$i,$color_2);  //数轴标记
}
$x_line_width=floor($high/30);        //横网格线数目
$x_line_density=$x_line_width==0 ? 0 :floor($high/$y_line_width);  //横网格线密度
if($zero_y > $high){             //绘制横网格线
  imagestring($pic,1,0,$high-3,round($min_num_add,$fix),$color_2); //零点数轴标记
  for($i=1;$i <= $x_line_width;$i++){
   imagesetthickness($pic,1);        //网格线宽
   imageline($pic,0+$empty_size_x,$high-$x_line_density*$i,$width+$empty_size_x,$high-$x_line_density*$i,$color_3);
   imagesetthickness($pic,2);        //轴点线宽
   imageline($pic,0+$empty_size_x,$high-$x_line_density*$i,3+$empty_size_x,$high-$x_line_density*$i,$color_2);
   imagestring($pic,1,0,$high-$x_line_density*$i-3,round($limit/$x_line_width*$i+$min_num_add,$fix),$color_2);  //数轴标记
  }
}else{
  imagestring($pic,1,$empty_size_x-8,$zero_y,"0",$color_2); //零点数轴标记
  for($i=1;$i <= ceil($x_line_width/2);$i++){
   imagesetthickness($pic,1);        //网格线宽
   imageline($pic,0+$empty_size_x,$zero_y-$x_line_density*$i,$width+$empty_size_x,$zero_y-$x_line_density*$i,$color_3);
   if($zero_y+$x_line_density*$i < $high){
    imageline($pic,0+$empty_size_x,$zero_y+$x_line_density*$i,$width+$empty_size_x,$zero_y+$x_line_density*$i,$color_3);
   }
   imagesetthickness($pic,2);        //轴点线宽
   imageline($pic,0+$empty_size_x,$zero_y-$x_line_density*$i,3+$empty_size_x,$zero_y-$x_line_density*$i,$color_2);
   if($zero_y+$x_line_density*$i < $high){
    imageline($pic,0+$empty_size_x,$zero_y+$x_line_density*$i,3+$empty_size_x,$zero_y+$x_line_density*$i,$color_2);
   }
   imagestring($pic,1,0,$zero_y-$x_line_density*$i-3,round($limit/$x_line_width*$i,$fix),$color_2);   //数轴标记
   if($zero_y+$x_line_density*$i < $high){
    imagestring($pic,1,0,$zero_y+$x_line_density*$i-3,round(-$limit/$x_line_width*$i,$fix),$color_2);  //数轴标记
   }
  }
}
//绘制轴线
imagesetthickness($pic,2);          //轴线宽
imageline($pic,1+$empty_size_x,0,1+$empty_size_x,$high,$color_2);
if($zero_y > $high){             //x轴位置
  imageline($pic,0+$empty_size_x,$high,$width+$empty_size_x,$high,$color_2);
}else{
  imageline($pic,0+$empty_size_x,$zero_y,$width+$empty_size_x,$zero_y,$color_2);
}
//产生折线
$point_x=0;
$j=0;
imagesetthickness($pic,$strong);       //线条粗细
while($j+1 < $allnum){
  imageline($pic,$point_x+2+$empty_size_x,$point_y[$j],$point_x+$x_pxdensity+2+$empty_size_x,$point_y[$j+1],$color_1);
  $point_x+=$x_pxdensity;
  $j++;
}
imagepng($pic);
imagedestroy($pic);
}
/*
函数描述及例子
参数说明:
$value_y -------- 包含你想生成折线图的数组,要求键值从0开始递增。
$width--------生成的折线图的网格宽度(不算白边)
$high--------高度
$strong-------线条粗细(默认为1)
$fix-------数据保留的位数(默认为取整)
*/
for($i=0;$i<100;$i++){
    $value = rand(1,200);
    $value_y[]=$value;
}
line_stats_pic($value_y,500,100,1,1);
?>

运行结果如下:

PHP实现的曲线统计图表示例

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP实现网上点歌(二)
Oct 09 PHP
PHP GD 图像处理组件的常用函数总结
Apr 28 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
php smarty模板引擎的6个小技巧
Apr 24 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
PHP实现图片上传并压缩
Dec 22 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
PHP实现的XXTEA加密解密算法示例
Aug 28 PHP
PHP  Yii清理缓存的实现方法
Nov 10 #PHP
PHP模拟http请求的方法详解
Nov 09 #PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 #PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 #PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 #PHP
thinkPHP批量删除的实现方法分析
Nov 09 #PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 #PHP
You might like
用PHP读取超大文件的实例代码
2012/04/01 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python网络编程 Python套接字编程
2017/09/13 Python
python如何修改装饰器中参数
2018/03/20 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
jupyter notebook 重装教程
2020/04/16 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
Ruby如何定义一个类
2012/10/08 面试题
经销商培训邀请函
2014/01/21 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
环境建议书
2015/02/04 职场文书
代理词怎么写
2015/05/25 职场文书
学习党章心得体会2016
2016/01/15 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技