加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php统计图形LIbchart类运用实例

发布时间:2023-05-29 12:41:46 所属栏目:PHP教程 来源:
导读:统计图形就我们会常到的数据图形了,如果三个数组以图形显示或楼盘以图形走向我们都会要用到图形,下面我来介绍一个php LIbchart图形生成类吧,很用的有需要的朋友可参考.简单全数字或英文的就可以直接使用下面类了,lib

统计图形就我们会常到的数据图形了,如果三个数组以图形显示或楼盘以图形走向我们都会要用到图形,下面我来介绍一个php LIbchart图形生成类吧,很用的有需要的朋友可参考.

简单全数字或英文的就可以直接使用下面类了,libchart类大家可自行百度下载:

<?php 

 /* 

  update by Leo 

  It's draw the pic of Sheet,and it will take all the num on the pic. 

 */ 

 require "./libchart/classes/libchart.php"; 

 class drawPic{ 

  var $chart; 

  var $style; 

  function drawPic($style="1",$width="500",$height="250"){ 

   $this->style=$style; 

   if($style==1){ 

    //cylinder 

    $this->chart = new VerticalBarChart($width,$height);  

   }else if($style==2){ 

    //line 

    $this->chart = new LineChart($width,$height); 

   }else if($style==3){ 

    //Lump 

    $this->chart = new PieChart($width,$height); 

   }else{ 

    //cross 

    $this->chart=new HorizontalBarChart($width,$height); 

   } 

  } 

   

  function draw($obj){ 

    

   if($this->style==1||$this->style=="1"){ 

    //cylinder 

    $dataSet = new XYDataSet() ; 

    $this->chart->setTitle($obj->title);//title 

    $arr=array(); 

    $arr=$obj->dataArray; 

    foreach($arr as $key => $val){ 

     $dataSet->addPoint ( new Point($key,$val)) ; 

    } 

    $this->chart->setDataSet ( $dataSet ) ;  

    $this->chart->render(); 

   }else if($this->style==2||$this->style=="2"){ 

    //line 

    $this->chart->setTitle($obj->title);//title 

    $arr=array(); 

    $arr=$obj->dataArray; 

    $i=0; 

    $dataSet = new XYSeriesDataSet(); 

    foreach($arr as $key => $val){ 

     $serie{$i}= new XYDataSet(); 

     foreach($val as $k => $v){ 

      $serie{$i}->addPoint(new Point($k,$v)); 

     } 

     $dataSet->addSerie($key,$serie{$i}); 

     $i=$i+1; 

    } 

    $this->chart->setDataSet($dataSet); 

    $this->chart->render(); 

   }else if($style==3){ 

    //Lump 

    $dataSet = new XYDataSet() ; 

    $this->chart->setTitle($obj->title);//title 

    $arr=array(); 

    $arr=$obj->dataArray; 

    foreach($arr as $key => $val){ 

     $dataSet->addPoint ( new Point($key."($val)",$val)) ; 

    } 

    $this->chart->setDataSet ( $dataSet ) ;  

    $this->chart->render(); 

   }else{ 

    //cross 

    $dataSet = new XYDataSet(); 

    $this->chart->setTitle($obj->title);//title 

    $arr=array(); 

    $arr=$obj->dataArray; 

    foreach($arr as $key => $val){ 

     $dataSet->addPoint ( new Point($key,$val)) ; 

    } 

    $this->chart->setDataSet($dataSet);  

    $this->chart->render(); 

   } 

  } 

 } 

 class kkk{}; 

 $n=new drawPic("4");//it will set 1 or 2 or 3 or 4 

 $k=new kkk(); 

 $k->dataArray=array("2000"=>"30","2001"=>"40","2002"=>"50","2003"=>"60","2004"=>"70","2005"=>"80","20020"=>"90");//style==1 or style=2 or style=4//开源代码Cuoxin.com 

 //$k->dataArray=array("2000"=>"30","2001"=>"40","2002"=>"50","2003"=>"60","2004"=>"70","2005"=>"80","20020"=>"90");//style==3 

 //$k->dataArray=array("yi"=>array("2000"=>"30","2001"=>"40","2002"=>"50","2004"=>"60"),"er"=>array("2003"=>"60","2004"=>"70","2005"=>"80","20020"=>"90"),"san"=>array("33"=>"12","45"=>"56","89"=>"45","86"=>"49"));//style==2 and the years will show first array to block.(it will be show 2000 2001 2002 2004) 

 $k->title="The Sheet title"; 

 $n->draw($k); 

?> 

方法1,2,4为相同的数组,3为线性图,有可能有两条线或者多条线的比较,也可以单线,如果要使用中文可能会发现libchart中文乱码 了,下面找了一个办法.

我们的应用主源代码如下:

<?php 

   header("content-type:image/png");   

   require_once('libchart/classes/libchart.php');  

   $chart = new VerticalBarChart( 500 , 250 ) ; // 参数表示需要创建的图像的宽和高 

   $dataSet = new XYDataSet() ; // 实例化一个 XY 轴数据对象 

     // 为这个对象增加四组数据集合, Point 对象的第一个参数表示 X 轴坐标, 

// 第二个表示 Y 轴坐标 

   $str = '二月';   

$str = mb_convert_encoding($str, "html-entities","utf-8" ); 

$dataSet -> addPoint ( new Point( "Jan 2005" , 273 )) ; 

    $dataSet -> addPoint ( new Point( "$str" , 120 )) ; 

    $dataSet -> addPoint ( new Point( "March 2005" , 442 )) ; 

    $dataSet -> addPoint ( new Point( "April 2005" , 600 )) ; 

     // 把这个数据集合传递给图形对象 

    $chart -> setDataSet ( $dataSet ) ; 

    // 设置图形的标题,并把它作为一个 png 文件渲染 

    $chart -> setTitle ( "统计图" ) ; 

    //$chart -> render ( "demo/generated/demo1.png" ) ;  

    // 这里需要一个路径和文件名称  

    //就这么简单一个像下图一样美丽的柱状图就出来了 

    $chart -> render () ;  

?> 

标红字的地方是为了解决中文乱码的.

2、标题乱码:

默认显示中文是乱码,这是由于编码的原因,做如下修改:首先,更改libchar/libchart/classes/view/chart/Chart.php,找到如下内容,代码如下:

public function setTitle($title) {      

      $this->plot->setTitle($title);

    }

更改为如下代码:

public function setTitle($title) { 

        $title = mb_convert_encoding($title, "html-entities","utf-8" ); 

           $this->plot->setTitle($title); 

第三步:就是上面某个博客里讲到的:

1、自己写的使用Libchart 库生成图表的php 文件以utf-8编码保存.

2、找几个中文字体库,比如华文行楷、宋体等等,复制到libchart fonts目录下.

3、修改libchart classes目录下的text.php 文件.

第47、48行,代码如下:

$this->fontCondensed = dirname(__FILE__) . "/../fonts/DejaVuSansCondensed.ttf";  

$this->fontCondensedBold = dirname(__FILE__) . "/../fonts/DejaVuSansCondensed-Bold.ttf"; 

改为:

$this->fontCondensed = dirname(__FILE__) . "/../fonts/你找来的中文字体"; 

$this->fontCondensedBold = dirname(__FILE__) . "/../fonts/你找来的中文字体";

我修改的代码如下:

public function Text() { 

    $baseDir = dirname(__FILE__) . "/../../../"; 

    // Free low-res fonts based on Bitstream Vera <http://dejavu.sourceforge.net/wiki/> 

   $this->fontCondensed = $baseDir . "fonts/FANGZHENGFANGSONG.ttf"; 

    $this->fontCondensedBold = $baseDir . "fonts/FANGZHENGFANGSONG.ttf"; 

   } 

FANGZHENGFANGSONG.ttf 这个文件是我找的方正仿宋简体字库,我把中文名字改成那个样子了,其实不改也是可以的.

主要是基本操作,然后又疑问的地方,按照上面说的做了,应该就是已经可以了,再次谢谢提供这些方法的热心网友,大家多多交流呀.

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!