php生成图形(Libchart)实例


Posted in PHP onNovember 06, 2013

统计图形就我们会常到的数据图形了,如果三个数组以图形显示或楼盘以图形走向我们都会要用到图形,下面我来介绍一个php LIbchart图形生成类吧,很用的有需要的朋友可参考。
简单全数字或英文的就可以直接使用下面类了(libchart类大家可自行百度下载)

<?
 /*
  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
 //$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 这个文件是我找的方正仿宋简体字库,我把中文名字改成那个样子了,其实不改也是可以的。
PHP 相关文章推荐
php 空格,换行,跳格使用说明
Dec 18 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 PHP
php 缩略图实现函数代码
Jun 23 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 PHP
PHP反射原理与用法深入分析
Sep 28 PHP
php ZipArchive压缩函数详解实例
Nov 06 #PHP
php根据分类合并数组的方法实例详解
Nov 06 #PHP
php foreach循环中使用引用的问题
Nov 06 #PHP
php用正则表达式匹配中文实例详解
Nov 06 #PHP
php引用传值实例详解学习
Nov 06 #PHP
php二维数组排序详解
Nov 06 #PHP
PHP Curl多线程原理实例详解
Nov 06 #PHP
You might like
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
php中switch语句用法详解
2015/08/17 PHP
Symfony查询方法实例小结
2017/06/28 PHP
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
vant时间控件使用方法详解
2020/12/24 Javascript
python中的多线程实例教程
2014/08/27 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
python 读取串口数据的示例
2020/11/09 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
求职推荐信范文
2013/12/01 职场文书
大学生简历的个人自我评价
2013/12/04 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
先进个人申报材料
2014/12/30 职场文书
经理岗位职责范本
2015/04/15 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android