本文实例讲述了PHP实现的曲线统计图表。分享给大家供大家参考,具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
<?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程序设计有所帮助。