php实现曲线图和柱状图

这段代码展示了如何使用PHP创建曲线图和柱状图。通过`build_graph`类,可以添加数据、设置颜色,并生成图像。类中包含了计算图形尺寸、颜色设置、画布创建、画框绘制、线条和矩形绘制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

/*******************用法*************************

    $gg=new build_graph();

 

    $d1=array(5,62,25,20,20,100,99,89,67,34,65);  //曲线一

//$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",1);          //参数0表示显示所有曲线,1为显示第一条,依次类推

 

    //生成矩形图

    //$gg->build("rectangle","1");    //参数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=800;

    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){

       $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++;

            }

 

       $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++;

            }

       }

 

    }

    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);

       $i=0;

       foreach($this->array_data[0] as $key=>$value)

       {

              //画竖线

              imageline($this->image,$this->width_var*$i,0,$this->width_var*$i,$this->graphheight,$colorGrey);

 

          //标出数字

           imagestring($this->image,2,$this->width_var*$i,$this->graphheight-15,$key,$colorRed);

 

           $i++;

       }

 

    }

    function build($graph,$str_var,$filename){

$filepath = 'D:/xampp/htdocs/gzc/graph//';

if(file_exists($filepath.$filename)){

            //

        }else{

  //$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,$filepath.$filename);

  imagedestroy($this->image);

}

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值