php生成折线图代码

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/******************************
*      折线图生成函数
******************************/
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 );
?>