PHP函数库03: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 ); 
?>  


函数来源:PHPCHINA youd

 

你可能感兴趣的:(PHP)