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 相关文章推荐
人大复印资料处理程序_查询篇
Oct 09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
实用函数9
Nov 08 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
PHP的一个基础知识 表单提交
Jul 04 PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 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
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
韩国现代百货官网:Hmall
2018/03/21 全球购物
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
护士毕业自我鉴定
2014/02/07 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书