本文实例讲述了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程序设计有所帮助。