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 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
php生成带logo二维码方法小结
Apr 08 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
php封装的smarty类完整实例
Oct 19 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
PHP文件上传小程序 适合初学者学习!
May 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
fgetcvs在linux的问题
2012/01/15 PHP
PHP之预定义接口详解
2015/07/29 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
Javascript的闭包
2009/12/31 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python如何快速实现分布式任务
2017/07/06 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python制作填词游戏步骤详解
2019/05/05 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
会计学个人自荐信模板
2013/12/13 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
数控机床专业自荐信
2014/05/19 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
白鹤梁导游词
2015/02/06 职场文书
努力学习保证书
2015/02/26 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
公证书
2019/04/17 职场文书
Redis安装使用RedisJSON模块的方法
2022/03/23 Redis