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的String类代码
Apr 20 PHP
基于empty函数的判断详解
Jun 17 PHP
destoon官方标签大全
Jun 20 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
Mar 03 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
Laravel用户授权系统的使用方法示例
Sep 16 PHP
详细分析PHP7与PHP5区别
Jun 26 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
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
JS之小练习代码
2008/10/12 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
js刷新页面location.reload()用法详解
2019/12/09 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python实现爬取逐浪小说的方法
2015/07/07 Python
使用Django清空数据库并重新生成
2020/04/03 Python
python interpolate插值实例
2020/07/06 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
EJB面试题
2015/07/28 面试题
应聘收银员个人的求职信
2013/11/30 职场文书
董事长助理岗位职责
2014/02/18 职场文书
员工工作能力评语
2014/12/31 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python
微信小程序实现轮播图指示器
2022/06/25 Javascript