php生成曲线图程序

网络整理 - 08-16

php生成  曲线图 程序

<?php
/*******************用法*************************
    $gg=new build_graph();
   
    $d1=array(0,62,25,20,20,100,99);  //曲线一
//$d1=array('15'=>5,'16'=>8,'17'=>7,'18'=>9,'19'=>10,'20'=>15,'21'=>9); 改成这个形式啦
    $d2=array(0,80,75,65,100,56,79);  //曲线二
    $d3=array(0,60,50,25,12,56,45);   //曲线三 一下可以继续以此类推
   
    $gg->add_data($d1);
    $gg->add_data($d2);
    $gg->add_data($d3);
   
    $gg->set_colors("ee00ff,dd8800,00ff00"); //对应曲线的颜色
   
    //生成曲线图
    $gg->build("line",0);          //参数0表示显示所有曲线,1为显示第一条,依次类推
   
    //生成矩形图
    //$gg->build("rectangle","2");    //参数0表示显示第一个矩形,1也为显示第一条,其余依次类推
   
///////////////////////////////////////////////////////////
    //自定义图形显示,可任意图形叠加显示
       header("Content-type: image/png");
       $gg->create_cloths();          //画布
       $gg->create_frame();          //画个框先
       //$gg->build_rectangle(2);       //画矩形
       $gg->create_line();             //画线
       $gg->build_line(0);             //画曲线
       imagepng($gg->image);
       imagedestroy($gg->image);
*/
class build_graph {
    var $graphwidth=300;
    var $graphheight=300;
    var $width_num=0;                //宽分多少等分
    var $height_num=10;                //高分多少等分,默认为10
    var $height_var=0;                //高度增量(用户数据平均数)
    var $width_var=0;                //宽度增量(用户数据平均数)
    var $height_max=0;                //最大数据值
    var $array_data=array();          //用户待分析的数据的二维数组
    var $array_error=array();          //收集错误信息
    var $colorBg=array(255,255,255);    //图形背景-白色
    var $colorGrey=array(192,192,192);    //灰色画框
    var $colorBlue=array(0,0,255);       //蓝色
    var $colorRed=array(255,0,0);       //红色(点)
    var $colorDarkBlue=array(0,0,255);    //深色
    var $colorLightBlue=array(200,200,255);       //浅色
    var $array_color;                //曲线着色(存储十六进制数)
    var $image;                      //我们的图像
    //方法:接受用户数据
    function add_data($array_user_data)
    {
       if(!is_array($array_user_data) or empty($array_user_data))
       {
          $this->array_error['add_data']="没有可供分析的数据";
          return false;
          exit();
       }
      
       $i=count($this->array_data);
      
       $this->array_data[$i]=$array_user_data;
      
    }
    //方法:定义画布宽和长
    function set_img($img_width,$img_height){
       $this->graphwidth=$img_width;
       $this->graphheight=$img_height;
    }
    //设定Y轴的增量等分,默认为10份
    function set_height_num($var_y){
       $this->height_num=$var_y;
    }
    //定义各图形各部分色彩
    function get_RGB($color){             //得到十进制色彩
    $R=($color>>16) & 0xff;
    $G=($color>>8) & 0xff;
    $B=($color) & 0xff;
    return (array($R,$G,$B));
    }
    //---------------------------------------------------------------
    #定义背景色
    function set_color_bg($c1,$c2,$c3){
       $this->colorBg=array($c1,$c2,$c3);
    }
    #定义画框色
    function set_color_Grey($c1,$c2,$c3){
       $this->colorGrey=array($c1,$c2,$c3);
    }
    #定义蓝色
    function set_color_Blue($c1,$c2,$c3){
       $this->colorBlue=array($c1,$c2,$c3);
    }
    #定义色Red
    function set_color_Red($c1,$c2,$c3){
       $this->colorRed=array($c1,$c2,$c3);
    }
    #定义深色
    function set_color_DarkBlue($c1,$c2,$c3){
       $this->colorDarkBlue=array($c1,$c2,$c3);
    }
    #定义浅色
    function set_color_LightBlue($c1,$c2,$c3){
       $this->colorLightBlue=array($c1,$c2,$c3);
    }
    //---------------------------------------------------------------
    //方法:由用户数据将画布分成若干等份宽
    //并计算出每份多少像素
    function get_width_num(){
       $this->width_num=count($this->array_data[0]);
    }
   
    function get_max_height(){
       //获得用户数据的最大值
       $tmpvar=array();
         
       foreach($this->array_data as $tmp_value)
       {
          $tmpvar[]=max($tmp_value);
       }
      
       $this->height_max=max($tmpvar);
      
       return max($tmpvar);
    }
   
    function get_height_length(){
       //计算出每格的增量长度(用户数据,而不是图形的像素值)
       $max_var=$this->get_max_height();
       $max_var=round($max_var/$this->height_num);
       $first_num=substr($max_var,0,1);
       if(substr($max_var,1,1)){
          if(substr($max_var,1,1)>=5)
             $first_num+=1;
       }
       for($i=1;$i<strlen($max_var);$i++){
          $first_num.="0";
       }
       return (int)$first_num;
    }
   
    function get_var_wh()  //得到高和宽的增量
    {         
       $this->get_width_num();
       //得到高度增量和宽度增量
       $this->height_var=$this->get_height_length();
      
       $this->width_var=round($this->graphwidth/$this->width_num);
    }
    function set_colors($str_colors){
       //用于多条曲线的不同着色,如$str_colors="ee00ff,dd0000,cccccc"
       $this->array_color=split(",",$str_colors);
    }
######################################################################################################
    function build_line($var_num)
    {
       if(!empty($var_num))
       {                   //如果用户只选择显示一条曲线
          $array_tmp[0]=$this->array_data[$var_num-1];
          $this->array_data=$array_tmp;
       }
      
        //画线
        
       for($j=0;$j<count($this->array_data);$j++)
       {
          list($R,$G,$B)=$this->get_RGB(hexdec($this->array_color[$j]));
         
          $colorBlue=imagecolorallocate($this->image,$R,$G,$B);
         
            $i=0;
              foreach($this->array_data[$j] as $keys=>$values)
            {
                $height_next_pix[]=round($this->array_data[$j][$keys]/$this->height_max*$this->graphheight);
            }
           
            foreach($this->array_data[$j] as $key=>$value)
            {
                $height_pix=round(($this->array_data[$j][$key]/$this->height_max)*$this->graphheight);
               
                if($i!=count($this->array_data[$j])-1)
                {
                    imageline($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$this->width_var*($i+1),$this->graphheight-$height_next_pix[$i+1],$colorBlue);
                }
               
                $i++;
            }
        
        //print_r($height_next_pix);
        // exit;
         /*
          for($i=0;$i<$this->width_num-1;$i++)
          {
             $height_pix=round(($this->array_data[$j][$i]/$this->height_max)*$this->graphheight);
             $height_next_pix=round($this->array_data[$j][$i+1]/$this->height_max*$this->graphheight);
             imageline($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$this->width_var*($i+1),$this->graphheight-$height_next_pix,$colorBlue);
          }*/
       }
      
      
       //画点
      
       $colorRed=imagecolorallocate($this->image, $this->colorRed[0], $this->colorRed[1], $this->colorRed[2]);
       for($j=0;$j<count($this->array_data);$j++)
       {
               $i=0;
            foreach($this->array_data[$j] as $key=>$value)
            {
                 $height_pix=round(($this->array_data[$j][$key]/$this->height_max)*$this->graphheight);
                 imagearc($this->image,$this->width_var*$i,$this->graphheight-$height_pix,6,5,0,360,$colorRed);
                 imagefilltoborder($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$colorRed,$colorRed);
                 $i++;
            }
       
        /*
          for($i=0;$i<$this->width_num;$i++)
          {
             $height_pix=round(($this->array_data[$j][$i]/$this->height_max)*$this->graphheight);
             imagearc($this->image,$this->width_var*$i,$this->graphheight-$height_pix,6,5,0,360,$colorRed);
             imagefilltoborder($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$colorRed,$colorRed);
          }
         */
       }
      
    }
######################################################################################################
    function build_rectangle($select_gra){
       if(!empty($select_gra)){                   //用户选择显示一个矩形
          $select_gra-=1;
       }
       //画矩形
       //配色
       $colorDarkBlue=imagecolorallocate($this->image, $this->colorDarkBlue[0], $this->colorDarkBlue[1], $this->colorDarkBlue[2]);
       $colorLightBlue=imagecolorallocate($this->image, $this->colorLightBlue[0], $this->colorLightBlue[1], $this->colorLightBlue[2]);
       if(empty($select_gra))
          $select_gra=0;
       for($i=0; $i<$this->width_num; $i++){
          $height_pix=round(($this->array_data[$select_gra][$i]/$this->height_max)*$this->graphheight);
          imagefilledrectangle($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$this->width_var*($i+1),$this->graphheight, $colorDarkBlue);
          imagefilledrectangle($this->image,($i*$this->width_var)+1,($this->graphheight-$height_pix)+1,$this->width_var*($i+1)-5,$this->graphheight-2, $colorLightBlue);
       }
    }
######################################################################################################
    function create_cloths(){
       //创建画布
       $this->image=imagecreate($this->graphwidth+20,$this->graphheight+20);
    }
    function create_frame(){
       //创建画框
       $this->get_var_wh();
       //配色
       $colorBg=imagecolorallocate($this->image, $this->colorBg[0], $this->colorBg[1], $this->colorBg[2]);
       $colorGrey=imagecolorallocate($this->image, $this->colorGrey[0], $this->colorGrey[1], $this->colorGrey[2]);
       //创建图像周围的框
       imageline($this->image, 0, 0, 0, $this->graphheight,$colorGrey);
       imageline($this->image, 0, 0, $this->graphwidth, 0,$colorGrey);
       imageline($this->image, ($this->graphwidth-1),0,($this->graphwidth-1),($this->graphheight-1),$colorGrey);
       imageline($this->image, 0,($this->graphheight-1),($this->graphwidth-1),($this->graphheight-1),$colorGrey);
    }
   
    function create_line()
    {
       //创建网格。
       $this->get_var_wh();
       $colorBg=imagecolorallocate($this->image, $this->colorBg[0], $this->colorBg[1], $this->colorBg[2]);
       $colorGrey=imagecolorallocate($this->image, $this->colorGrey[0], $this->colorGrey[1], $this->colorGrey[2]);
       $colorRed=imagecolorallocate($this->image, $this->colorRed[0], $this->colorRed[1], $this->colorRed[2]);
      
       for($i=1;$i<=$this->height_num;$i++)
       {
          //画横线
          $y1=($this->graphheight-($this->height_var/$this->height_max*$this->graphheight)*$i);
         
          $y2=($this->graphheight-($this->height_var/$this->height_max*$this->graphheight)*$i);
         
          imageline($this->image,0,$y1,$this->graphwidth,$y2,$colorGrey);
         
          //标出数字
          imagestring($this->image,2,0,$this->graphheight-($this->height_var/$this->height_max*$this->graphheight)*$i,$this->height_var*$i,$colorRed);
       }
      
       unset($i);
      
       foreach($this->array_data[0] as $key=>$value)
       {
              //画竖线
              imageline($this->image,$this->width_var*$i,0,$this->width_var*$i,$this->graphwidth,$colorGrey);
         
          //标出数字
           imagestring($this->image,2,$this->width_var*$i,$this->graphheight-15,$key,$colorRed);
          
           $i++;
       }
      
       /*
       for($i=1;$i<=$this->width_num;$i++)
       {
          //画竖线
          imageline($this->image,$this->width_var*$i,0,$this->width_var*$i,$this->graphwidth,$colorGrey);
          //标出数字
          imagestring($this->image,2,$this->width_var*$i,$this->graphheight-15,$i,$colorRed);
       }
       */
    }
    function build($graph,$str_var){
       //$graph是用户指定的图形种类,$str_var是生成哪个数据的图
       header("Content-type: image/jpeg");
       $this->create_cloths();          //先要有画布啊~~
       switch ($graph){
          case "line":
             $this->create_frame();          //画个框先:)
             $this->create_line();          //打上底格线
             $this->build_line($str_var);          //画曲线
             break;
          case "rectangle":
             $this->create_frame();                   //画个框先:)
             $this->build_rectangle($str_var);          //画矩形
             $this->create_line();                   //打上底格线
             break;
       }
       //输出图形并清除内存
       imagepng($this->image);
       imagedestroy($this->image);
    }
}
?>