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下通过POST还是GET来传值
Jun 05 PHP
关于PHP语言构造器介绍
Jul 08 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
Jan 14 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 PHP
thinkphp3.0输出重复两次的解决方法
Dec 19 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
Openlayers绘制地图标注
2020/09/28 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
电子信息专业自荐书
2014/02/04 职场文书
前台文员职责范本
2014/03/07 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
2014年建筑工作总结
2014/11/26 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
详解Vue router路由
2021/11/20 Vue.js