[PHP] php 折线图 生成函数 →→→→→进入此内容的聊天室

来自 , 2021-04-16, 写在 PHP, 查看 148 次.
URL http://www.code666.cn/view/fa2e8c43
  1. /******************************
  2. *      折线图生成函数
  3. *      youd
  4. *      090207-01
  5. ******************************/
  6. function line_stats_pic ( $value_y,$width,$high,$strong=1,$fix=0 )
  7. {
  8. //y值处理函数
  9.         function line_point_y ( $num,$width,$high,$max_num_add,$min_num_add,$y_pxdensity )
  10.         {
  11.                 $return=$high-floor ( ( $num-$min_num_add+$y_pxdensity ) / ( ( $max_num_add-$min_num_add ) /$high ) );
  12.                 return $return;
  13.         }
  14.  
  15. //参数处理
  16.         $allnum=sizeof ( $value_y );
  17.         $max_num=max ( $value_y );           //最大值
  18.         $min_num=min ( $value_y );           //最小值
  19.         $limit_m=$max_num-$min_num;            //极差
  20.         $max_num_add=$max_num+$limit_m*0.1;        //轴最大值
  21.         $min_num_add=$min_num-$limit_m*0.1;        //轴最小值
  22.         $limit=$max_num_add-$min_num_add;         //极差-坐标轴y
  23.         $y_pxdensity= ( $max_num_add-$min_num_add ) /$high;  //y轴密度
  24.         $x_pxdensity=floor ( $width/$allnum );     //x轴密度
  25.         reset ( $value_y );              //将数组指针归零
  26.         $i=0;
  27.         foreach ( $value_y as $val )
  28.         {
  29.                 $point_y[$i]=line_point_y ( $val,$width,$high,$max_num_add,$min_num_add,$y_pxdensity );
  30.                 $i++;
  31.         }
  32.         $zero_y=line_point_y ( 0,$width,$high,$max_num_add,$min_num_add,$y_pxdensity );  //零点的y值
  33.         $empty_size_x= ( strlen ( $max_num ) > strlen ( $min_num ) ? strlen ( $max_num ) : strlen ( $min_num ) ) *5+3;          //左边空白
  34.  
  35. //图片流开始
  36.         header ( "Content-type:image/png" );
  37.         $pic=imagecreate ( $width+$empty_size_x+10,$high+13 );
  38.         imagecolorallocate ( $pic,255,255,255 );  //背景色
  39.         $color_1=imagecolorallocate ( $pic,30,144,255 ); //线条色
  40.         $color_2=imagecolorallocate ( $pic,0,0,0 );   //黑色
  41.         $color_3=imagecolorallocate ( $pic,194,194,194 );//灰色
  42. //绘制网格
  43.         imagesetthickness ( $pic,1 );       //网格线宽
  44.         $y_line_width=floor ( $width/100 );    //纵网格线数目
  45.         $y_line_density=$y_line_width==0 ? 0 :floor ( $width/$y_line_width ); //纵网格线密度
  46.         $point_zero_y=$zero_y > $high ? $high : $zero_y;
  47.         imagestring ( $pic,1,$empty_size_x-1,$high+4,"0",$color_2 ); //零点数轴标记
  48.         for ( $i=1; $i <= $y_line_width; $i++ )  //绘制纵网格线
  49.         {
  50.                 imagesetthickness ( $pic,1 );      //网格线宽
  51.                 imageline ( $pic,$y_line_density*$i+$empty_size_x,0,$y_line_density*$i+$empty_size_x,$high,$color_3 );
  52.                 imagesetthickness ( $pic,2 );      //轴点线宽
  53.                 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 );
  54.                 imagestring ( $pic,1,100*$i+$empty_size_x-5,$high+4,$allnum/$y_line_width*$i,$color_2 );  //数轴标记
  55.         }
  56.         $x_line_width=floor ( $high/30 );     //横网格线数目
  57.         $x_line_density=$x_line_width==0 ? 0 :floor ( $high/$y_line_width );  //横网格线密度
  58.         if ( $zero_y > $high )           //绘制横网格线
  59.         {
  60.                 imagestring ( $pic,1,0,$high-3,round ( $min_num_add,$fix ),$color_2 ); //零点数轴标记
  61.                 for ( $i=1; $i <= $x_line_width; $i++ )
  62.                 {
  63.                         imagesetthickness ( $pic,1 );     //网格线宽
  64.                         imageline ( $pic,0+$empty_size_x,$high-$x_line_density*$i,$width+$empty_size_x,$high-$x_line_density*$i,$color_3 );
  65.                         imagesetthickness ( $pic,2 );     //轴点线宽
  66.                         imageline ( $pic,0+$empty_size_x,$high-$x_line_density*$i,3+$empty_size_x,$high-$x_line_density*$i,$color_2 );
  67.                         imagestring ( $pic,1,0,$high-$x_line_density*$i-3,round ( $limit/$x_line_width*$i+$min_num_add,$fix ),$color_2 );  //数轴标记
  68.                 }
  69.         }
  70.         else
  71.         {
  72.                 imagestring ( $pic,1,$empty_size_x-8,$zero_y,"0",$color_2 ); //零点数轴标记
  73.                 for ( $i=1; $i <= ceil ( $x_line_width/2 ); $i++ )
  74.                 {
  75.                         imagesetthickness ( $pic,1 );     //网格线宽
  76.                         imageline ( $pic,0+$empty_size_x,$zero_y-$x_line_density*$i,$width+$empty_size_x,$zero_y-$x_line_density*$i,$color_3 );
  77.                         if ( $zero_y+$x_line_density*$i < $high )
  78.                         {
  79.                                 imageline ( $pic,0+$empty_size_x,$zero_y+$x_line_density*$i,$width+$empty_size_x,$zero_y+$x_line_density*$i,$color_3 );
  80.                         }
  81.                         imagesetthickness ( $pic,2 );     //轴点线宽
  82.                         imageline ( $pic,0+$empty_size_x,$zero_y-$x_line_density*$i,3+$empty_size_x,$zero_y-$x_line_density*$i,$color_2 );
  83.                         if ( $zero_y+$x_line_density*$i < $high )
  84.                         {
  85.                                 imageline ( $pic,0+$empty_size_x,$zero_y+$x_line_density*$i,3+$empty_size_x,$zero_y+$x_line_density*$i,$color_2 );
  86.                         }
  87.                         imagestring ( $pic,1,0,$zero_y-$x_line_density*$i-3,round ( $limit/$x_line_width*$i,$fix ),$color_2 );   //数轴标记
  88.                         if ( $zero_y+$x_line_density*$i < $high )
  89.                         {
  90.                                 imagestring ( $pic,1,0,$zero_y+$x_line_density*$i-3,round ( -$limit/$x_line_width*$i,$fix ),$color_2 );  //数轴标记
  91.                         }
  92.                 }
  93.         }
  94. //绘制轴线
  95.         imagesetthickness ( $pic,2 );       //轴线宽
  96.         imageline ( $pic,1+$empty_size_x,0,1+$empty_size_x,$high,$color_2 );
  97.         if ( $zero_y > $high )           //x轴位置
  98.         {
  99.                 imageline ( $pic,0+$empty_size_x,$high,$width+$empty_size_x,$high,$color_2 );
  100.         }
  101.         else
  102.         {
  103.                 imageline ( $pic,0+$empty_size_x,$zero_y,$width+$empty_size_x,$zero_y,$color_2 );
  104.         }
  105. //产生折线
  106.         $point_x=0;
  107.         $j=0;
  108.         imagesetthickness ( $pic,$strong );    //线条粗细
  109.         while ( $j+1 < $allnum )
  110.         {
  111.                 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 );
  112.                 $point_x+=$x_pxdensity;
  113.                 $j++;
  114.         }
  115.         imagepng ( $pic );
  116.         imagedestroy ( $pic );
  117. }
  118.  
  119. /*
  120. 函数描述及例子
  121. 参数说明:
  122. $value_y -------- 包含你想生成折线图的数组,要求键值从0开始递增。
  123. $width--------生成的折线图的网格宽度(不算白边)
  124. $high--------高度
  125. $strong-------线条粗细(默认为1)
  126. $fix-------数据保留的位数(默认为取整)
  127. */
  128.  
  129. for ( $i=0; $i<100; $i++ )
  130. {
  131.         $value = rand ( 1,200 );
  132.         $value_y[]=$value;
  133. }
  134. line_stats_pic ( $value_y,500,100,1,1 );
  135. ?>

回复 "php 折线图 生成函数"

这儿你可以回复上面这条便签

captcha