php gd 库绘图 正态分布

<?php
 class Draw{
 private $im,$stu=FALSE;  //
 protected   $sets = array (    //可设置参数
         "size" => array (    //图像大小 
             "width" => 900,
             "height" => 700 
           ),               
         "position" => array (  //圆点位置
             "x" =>50,
             "y" =>50
          ),                 
         "lengths" => array (   //x,y轴长
             "x" => 800,
             "y" => 600
          ),                
         "avr" => array (   //x,y 轴刻度数量
             "x" =>20,
             "y" =>10
          ), 
         "max" => array (   //x,y 最大值
             "x" =>10000,
             "y" =>1000
          ),         
         "width" => 1,  //柱状图宽 
         "color" => array (   //x,y 轴刻度数量
             "shapcolor" =>array (0,0,0),  //柱形图颜色
             "xline" =>array (0,0,0),    //x轴颜色
             "xlineK" =>array (0,0,0),    //x轴标记
             "xlineW" =>array (0,0,0),    //x轴文字
             "yline" =>array (0,0,0),    //y轴颜色
             "ylineK" =>array (0,0,0),    //y轴标记
             "ylineW" =>array (0,0,0),    //x轴文字
             "background" =>array (255,255,255)  //背景色
          ),
          
          "words" => array (   //文字与xy轴距离
             "down" =>40,  
             "left" =>40
          ),       
      ) ;
   
   protected function drawArr($arr){      //取数组直画柱形图
         if ($this->stu==FALSE){
               $this->prepare();
         }
         $shape1 = $this->sets['color']['shapcolor'];
         $shape = imagecolorallocate($this->im,$shape1[0],$shape1[1],$shape1[2]);
         $x = $this->sets['position']['x'];
         $y = $this->sets['size']['height'] - $this->sets['position']['y'];     
         $h = $this->sets['max']['y']/$this->sets['lengths']['y'];
      $counts = count($arr);
      
      $xlineW1 = $this->sets['color']['xlineW'];
      $xlineW = imagecolorallocate($this->im,$xlineW1[0],$xlineW1[1],$xlineW1[2]);
      for ($i=0;$i<$counts;$i++){  //循环绘画出柱状图
             $x1 = $arr[$i][0]+$x;
             
             if(($arr[$i][1]/$h)<=$this->sets['lengths']['y']){
             imagefilledrectangle($this->im,$x1,$y,($x1+$this->sets['width']),($y-$arr[$i][1]/$h),$shape);   
             }
             else {
                  $arr1 = $this->sets['lengths']['y'];
                  imagefilledrectangle($this->im,$x1,$y,($x1+$this->sets['width']),($y-$arr1),$shape);
                 // imagestring($this->im,2,$x1,$y-$num,$arr[$i][1],$ylineW); //越界写上值
                  imagestringup($this->im,2,$x1,($y-$arr1),$arr[$i][1],$xlineW);  //数值
             }
          
      }             
   }
   
   protected function done($address,$name){  //输出 
        imagepng($this->im,$address."/".$name.".png");
      imagedestroy($this->im);
      return $address."/".$name.".png";     
   }
   
   private function prepare(){      //绘图准备
      $x = $this->sets['position']['x'];
      $y = $this->sets['size']['height']-$this->sets['position']['y'];
      $this->im = imagecreate($this->sets['size']['width'],$this->sets['size']['height']);    
      $black1 = $this->sets['color']['background'];    
      $black = imagecolorallocate($this->im,$black1[0],$black1[1],$black1[2]);  
      $xline1 = $shape1 = $this->sets['color']['xline'];
      $xline = imagecolorallocate($this->im, $xline1[0],$xline1[1],$xline1[2]);
      $yline1 = $shape1 = $this->sets['color']['yline'];
      $yline = imagecolorallocate($this->im,$yline1[0],$yline1[1],$yline1[2]);
      $yellow = imagecolorallocate($this->im,255,255,0);         
      imageline($this->im,$x,$y,($x+$this->sets['lengths']['x']),$y,$xline);  //画x轴         
      imageline($this->im,$x,$y,$x,($y-$this->sets['lengths']['y']),$yline);  //画y轴  
      $this->drawY();
      $this->drawX();
      $this->stu=TRUE;     
   }
   
   private function drawY(){  //循环画y轴刻度 
         $kedu = (int)($this->sets['lengths']['y']/$this->sets['avr']['y']);
         $kedu1 = (int)($this->sets['max']['y']/$this->sets['avr']['y']);
         $ylineW1 = $this->sets['color']['ylineW'];
         $ylineW = imagecolorallocate($this->im,$ylineW1[0],$ylineW1[1],$ylineW1[2]);
         $ylineK1 = $this->sets['color']['ylineK'];
         $ylineK = imagecolorallocate($this->im, $ylineK1[0],$ylineK1[1],$ylineK1[2]);
         $x = $this->sets['position']['x'];
         $x1 = $this->sets['position']['x']-$this->sets['words']['left'];
         $y = $this->sets['size']['height']-$this->sets['position']['y'];
      for ($i=0;$i <= $this->sets['avr']['y'];$i++) {
         $num =$i*$kedu;    
         imagestring($this->im,2,$x1,$y-$num,$kedu1*$i,$ylineW);     //数值
         imageline($this->im,$x+10,$y-$num,$x,$y-$num,$ylineK);  //画标号       
      }
   }
 
   private function drawX(){  //循环画x轴刻度 
         $kedu = (int)($this->sets['lengths']['x']/$this->sets['avr']['x']);
      $kedu1 = (int)($this->sets['max']['x']/$this->sets['avr']['x']);
      $xlineW1 = $this->sets['color']['xlineW'];
         $xlineW = imagecolorallocate($this->im,$xlineW1[0],$xlineW1[1],$xlineW1[2]); 
         $xlineK1 = $this->sets['color']['xlineK'];
         $xlineK = imagecolorallocate($this->im, $xlineK1[0],$xlineK1[1],$xlineK1[2]);
         $x = $this->sets['position']['x'];
         $y = $this->sets['size']['height']- $this->sets['position']['y'];
         $y1 = $y + $this->sets['words']['down'];
         
      for ($i=1;$i <= $this->sets['avr']['x'];$i++) {
         $num =$i*$kedu;    
         imagestringup($this->im,2,$num+$x,$y1,$kedu1*$i,$xlineW);  //数值
         imageline($this->im,$x+$num,$y-10,$x+$num,$y,$xlineK);  //画标号          
      }
   } 
 }
?>

<?php
 include 'Draw.php';
 class Idraw extends Draw{    
     private $arr = array ();
     private $arr1 = array ();
     private $arrT = array ();
      
    function putIn($arr){
        $counts = count($arr);
        $avr = $this->sets['max']['x']/($this->sets['lengths']['x']/$this->sets['width']);    
        for ($i=0;$i < $counts;$i++){           
           $mod = (int)($arr[$i][0]/$avr);                 
           if(!in_array($mod, $this->arr)){           
               array_push($this->arr, $mod);
               array_push($this->arr1, $arr[$i][1]);
           } 
           else {  
                  $key = array_search($mod,$this->arr);
                  $this->arr1[$key] = ($this->arr1[$key]+$arr[$i][1]);     
           }                 
        }
        //echo $this->arr1[0];
    }
     
    function getOut($address, $name){
        $this->arrT();
        $this->drawArr($this->arrT);
        return $this->done($address, $name);
    }
    
    private function  arrT(){
        $counts = count($this->arr);
        for ($i=0;$i < $counts;$i++){
            $arr = array ($this->arr[$i],$this->arr1[$i]);
            array_push($this->arrT, $arr);          
        }     
    }
     
 }

测试用代码:

<?php

  include 'Idraw.php';
  
  $arr = array (
   array(130,100),
   array(131,100),
   array(465,105),
   array(9997,200),
   array(5000,600),
   array(7000,200),
   array(6000,600),
   array(8000,400),
   
);

 $arr1 = array (
   array(130,100),
   array(8001,900),
   array(8500,1800),
 );

  
 $draw1 = new Idraw();
 $draw1->putIn($arr);
 $draw1->putIn($arr1);
 $draw1->getOut("image","yes1");
 echo "<img src='image/yes1.png'/>";
 ///home/m/Dev/cvs/ImRoBot5/spider2/newshive/admin
 
 
 
    ?>

posted @ 2011-06-12 21:34  wangkangluo1  阅读(1286)  评论(0编辑  收藏  举报