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
phpMyAdmin下载、安装和使用入门教程
May 31 PHP
php入门小知识
Mar 24 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
php的ajax框架xajax入门与试用介绍
Dec 19 PHP
php使用递归函数实现数字累加的方法
Mar 16 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
php使用crypt()函数进行加密
Jun 08 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 PHP
用php实现分页效果的示例代码
Dec 10 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
Python三元运算实现方法
2015/01/12 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
Python流程控制常用工具详解
2020/02/24 Python
python温度转换华氏温度实现代码
2020/12/06 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
公司市场部岗位职责
2013/12/02 职场文书
企业统计员岗位职责
2013/12/13 职场文书
迟到检讨书1000字
2014/01/15 职场文书
人事任命书格式
2014/06/05 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
Python函数中的不定长参数相关知识总结
2021/06/24 Python
python3操作redis实现List列表实例
2021/08/04 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL