• 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
     
     
     
        ?>

  • 相关阅读:
    [Java]去除html中的标签或者元素属性(正则表达式)
    一份非常完整的 MySQL 规范
    前端统计图 echarts 实现简单柱状图
    获取一个表中的字段总数(mysql) Navicat如何导出Excel格式表结构 获取某个库中的一个表中的所有字段和数据类型
    【学习笔记】splay入门(更新中)
    【题解】P1972 [SDOI2009]HH的项链
    【题解】P2024 [NOI2001]食物链
    【题解】P1291 百事世界杯之旅
    【题解】P2602 数字计数
    【题解】P2831 愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2079166.html
Copyright © 2020-2023  润新知