yinzhili 发表于 2009-8-14 10:25:39

在CI中使用pChart库

本帖最后由 yinzhili 于 2009-8-14 10:57 编辑

pChart是一个免费的PHP图表生成库,可以生成多种图表如饼图或者柱状图等等,需要GD库的支持。下面我来简单讲讲如何在CI中方便地使用它。

首先我们要下载pChart。访问http://pchart.sourceforge.net/download.php 就可以下载到最新版的pChart,目前最新的版本是1.27。解压下载到的文件,我们要用到的只是其中的pChart文件夹,里面有pChart.class、pCache.class和pData.class这三个文件。我们把pChart文件夹复制到 application/libraries/ 下面。

然后要准备字体,因为我们做报表很可能要输出中文,所以必须使用一种中文字体,至于选什么字体就看你的喜好了(如果是商业用途的话请注意字体的版权以免引起版权纠纷),把中文字体的ttf文件复制到 application/libraries/pChart 下面即可。

通过库的形式来使用pChart,因此在 application/libraries/ 下面创建一个文件,命名为 Chart.php,代码如下:

<?php
class Chart {
    function Chart() {
      include(APPPATH."libraries/pChart/pData.class");
      include(APPPATH."libraries/pChart/pChart.class");
    }
    function draw_line_graph($params) {
      $DataSet = new pData;
      $DataSet->AddPoint($params['data'],"Serie1");//需要显示的数据
      $DataSet->AddPoint($params['date'],"Serie2"); //横坐标的数据
      $DataSet->AddSerie("Serie1");
      $DataSet->SetAbsciseLabelSerie("Serie2");
      $DataSet->SetSerieName("订单总金额","Serie1");
      $DataSet->SetYAxisName("RMB"); //纵坐标上显示的文字
      $DataSet->SetXAxisName('横坐标:日期'); //横坐标上显示的文字
      $DataSet->SetXAxisFormat("date"); //横坐标的数据类型
      
      $Test = new pChart($params['height'],$params['width']); //图表文件的高度和宽度
      $Test->setDateFormat($params['date_format']); //横坐标显示的日期格式
      $Test->setColorPalette(0,255,0,0);

      $Test->setFontProperties(APPPATH."libraries/pChart/FZLTXIHK.ttf",12); //设置使用的字体及字号
      $Test->setGraphArea(60,60,$params['x_area'],$params['y_area']); //图形区域的高度和宽度
      $Test->drawGraphArea(252,252,252); //线的颜色
      $Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2);
      $Test->drawGrid(4,TRUE,230,230,230,255);
      
      $Test->drawLineGraph($DataSet->GetData(),$DataSet->GetDataDescription());
      $Test->drawPlotGraph($DataSet->GetData(),$DataSet->GetDataDescription(),3,2,255,255,255);
      $Test->setFontProperties(APPPATH."libraries/pChart/FZLTXIHK.ttf",8); //设置数据值所用字体及字号
      $Test->writeValues($DataSet->GetData(),$DataSet->GetDataDescription(),"Serie1"); //输出每个点的数据值
      
      $Test->setFontProperties(APPPATH."libraries/pChart/FZLTXIHK.ttf",11); //设置使用的字体及字号
      $Test->drawLegend(75,65,$DataSet->GetDataDescription(),255,255,255);

      $Test->setFontProperties(APPPATH."libraries/pChart/FZLTXIHK.ttf",12); //设置使用的字体及字号
      $Test->drawTitle(60,22,$params['title'],50,50,50,585);

      $imagefile='public/temp/'.$params['filename'].'.png'; //设置生成文件的保存路径
      $Test->Render($imagefile);   //生成文件

      return $imagefile;//返回文件名
    }
}

控制器:

function test(){
   $this->load->library('chart'); //载入pChart库
   
   $params['data']=array(100,200,150,600,230,150,510); //要显示的数据
   for($i=0;$i<7;$i++){
         $params['date'][$i]=1250217066+$i*86400; //要显示的日期,注意这里是Unix时间戳,pChart会自动传换成你要的格式
}
    $params['title']='销售报表'; //图片标题
   $params['date_format']='m月j日';//设置日期格式
   $params['filename']='test_image';//文件名   
   $params['height']=600; //高度
   $params['width']=300; //宽度
   $params['x_area']=560; //图形区域高度
   $params['y_area']=280; //图形区域宽度
   $data['chart_image']=$this->chart->draw_line_graph($params);//生成图片
   $data['baseurl']=site_url();
    $this->load->view('test_view.html',$data);
}

视图:test_view.html

<html>
<head><title></title></head>
<body>
<img src="<?php echo $baseurl.$chart_image;?>" />
</body>
</html>

最终生成的图表是这样的:

yinzhili 发表于 2009-8-14 10:52:49

关于pChart的更多用法,请参考它的在线文档:
http://pchart.sourceforge.net/documentation.php

trynews 发表于 2010-6-5 11:37:30

pChart下载不了,能放个附件上不吗?

longjianghu 发表于 2010-6-5 17:32:58

不错的类库,也准备使用.

Minux2007 发表于 2010-6-5 23:10:33

PCHART不错,做个标记:lol

lgj11 发表于 2010-6-15 17:12:03

怎么不好使,好象文件路径有问题,有没有调通的

荒野无灯 发表于 2010-7-14 16:32:17

好文章,收藏一下

menzhi007 发表于 2010-7-22 17:06:54

老出问题,这个怎么回事呢


A PHP Error was encountered

Severity: Warning

Message: imageftbbox() : Invalid font filename

Filename: pChart/pChart.class

Line Number: 556

erebus 发表于 2010-7-23 08:54:39

mark, thx!

zhengkebo 发表于 2010-11-1 10:59:05

例子测试结果:
报表可以正常生成,
但是有代码错误提示:pData.class 文件 第126行 Uninitialized string offset: 0

解决办法:
修改 pData.class 文件 第126行
修改后代码如下:
for($i=0;$i<=count($this->Data);$i++)
   {
             if(is_array($this->Data) && isset($this->Data[$i][$Serie]))
             {
                     $ID = $i+1;
             }
   }
页: [1] 2
查看完整版本: 在CI中使用pChart库