PHP PEAR中创建图表的Image_Graph Package入门

转载请注明出处:Just Do IT :: http://www.toplee.com/blog/?p=169
TrackBack URL: http://www.toplee.com/blog/wp-trackback.php?p=169

在很多时候,我们在进行php开发中需要创建一些图表。在创建图表的方法中,我们可以使用传统的从电子表格软件导出生成,比如使用excel等工具来生成,这样的方法有些局限性,在web应用中我们可以借用PHP来实现。PHP提供了不少强大的图表操作库,JpGraph算是最知名的,但是他涉及到商业license的问题。这里我介绍大家一个PHP Pear中的图表操作包 Image_Graph,这是个在GPL协议下开发的包。虽然这个包的文档很少,但是它具有的强大功能还是得到了广泛的认同,在使用这个包之前,你必须了解PHP的Pear架构同时已经成功的安装了Pear,相关的文档我就不在这里介绍了,很多这样的文档可以Google到。

ImageGraph的前身是GraPHPite,它是SourceForge的一个项目,后来被收录并整合到了Pear中并命名为Image_Graph。在Image_Graph中,你可以对图表、表格、曲线等进行各种自由的控制。

使用Image_Graph的必要条件:
PHP 4.3.0 or later (it works with PHP 5)
GD (GD 2 is recommended)
PEAR support
The Image_Canvas package
The Image_Color package

安装
安装Image_Graph非常简单,你可以使用PEAR安装命令来完成,相关的文档请参照Pear的官方网站。默认的安装过程和下面类似:

$ pear list
Installed packages:
===================
Package Version State
Archive_Tar 1.1 stable
Console_Getopt 1.2 stable
DB 1.6.2 stable
HTTP 1.2.2 stable
Mail 1.1.3 stable
Net_SMTP 1.2.6 stable
Net_Socket 1.0.1 stable
PEAR 1.3.2 stable
XML_Parser 1.0.1 stable
XML_RPC 1.1.0 stable

(有两种主要的方式来安装PEAR包,你可以直接从PEAR的服务器上安装,也可以下载安装包到本地机器上进行安装,两种方法基本相同。由于有些Pear的包还处于alpha阶段,包括Image_Graph包,所以你可能在Pear的stable列表中找不到想要的包,这时您就只能选择去下载安装包到本地机器上完成安装,在下载的时候一定注意文档里面对该包的依赖关系说明,比如Image_Graph包就需要依赖 Image_Color, Image_Canvas,不过你需要同时注意,也许在你看到这个文档的时候,包的版本已经更新,同时依赖关系可能也发生了变化,此时您最好参照最新的帮助文档来进行。在安装的过程中,您最好要按照正确的依赖包安装顺序来进行,否则可能会出现安装失败。)

$ pear install Image_Color-1.0.2.tgz
install ok: Image_Color 1.0.2

$ pear install Image_Canvas-0.3.0.tgz
install ok: Image_Canvas 0.3.0

$ pear install Image_Graph-0.7.2.tgz
Optional dependencies:
package `Numbers_Roman’ is recommended to utilize some features.
package `Numbers_Words’ is recommended to utilize some features.
install ok: Image_Graph 0.7.2

Numbers_Roman 和 Numbers_Words 依赖包是可选的用来进行一些扩展功能实现,这里我们暂时不涉及。

一个简单的图表例子:
创建一个条形的图表是最简单的,这里我们通过编码的方式来简单实现,数据源也是通过在代码中写入测试数据来提供,更复杂的方式可以从数据库或者别的数据源中取得。
image_graph.php

addNew(‘plotarea’);
$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5);
$Dataset->addPoint(‘Feb’, 13);
$Dataset->addPoint(‘March’, 10);
$Plot =& $Plotarea->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setFillColor(‘cadetblue’);
$Plot->setBackgroundColor(‘green@0.1’);

$Graph->done();
?>

image_graph1
第一行代码:

include ‘Image/Graph.php’;

这是必须包含的代码,用来调入image_graph包。
第二行代码:

$Graph =& Image_Graph::factory(‘graph’, array(600, 300));

申明一个图表对象,同时创建一个宽600 pixels 高 300 pixels的画布. 这里使用了工厂的设计模式,你不用一定使用这样的方式,但是这种方式将是最方便的。有关工厂模式可以参考设计模式方面的文档,这里不讨论。
下一行:

$Dataset =& Image_Graph::factory(‘dataset’);

创建一个数据集,这个用来存放创建图表所需的各种数据,接下来使用数组的方式进行数据存放,还有另外的数据存储方式在后面说明。
后面三行:

$Dataset->addPoint(‘Jan’, 5);
$Dataset->addPoint(‘Feb’, 13);
$Dataset->addPoint(‘March’, 10);

输入必要的数据.
下一行:

$Plot =& $Plotarea->addNew(‘bar’, &$Dataset);

创建一个名为bar的象限,可以支持多个象限,这里我们只使用一个。

$Graph->done();

完成图表创建!

增加一些颜色到图表中
上面创建的图片显然太过简单,下面给图片增加一些颜色。
image_graph2.php

addNew(‘plotarea’);
$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5);
$Dataset->addPoint(‘Feb’, 13);
$Dataset->addPoint(‘March’, 10);
$Plot =& $Plotarea->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setFillColor(‘cadetblue’);
$Plot->setBackgroundColor(‘green@0.1’);addNew(‘plotarea’);
$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5, ‘J’);
$Dataset->addPoint(‘Feb’, 13, ‘F’);
$Dataset->addPoint(‘March’, 10, ‘M’);
$Plot =& $Plotarea->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setBackgroundColor(‘green@0.1’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot->setFillStyle($fill);

$Graph->done();
?>

image_graph2
你可以使用更多的颜色,有关颜色名称的定义可以参考 147 SVG color names

使用多种颜色
下面的例子对图表中不同的部分使用不同的颜色。
image_graph3.php

addNew(‘plotarea’);
$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5, ‘J’);
$Dataset->addPoint(‘Feb’, 13, ‘F’);
$Dataset->addPoint(‘March’, 10, ‘M’);
$Plot =& $Plotarea->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setBackgroundColor(‘green@0.1’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot->setFillStyle($fill);

$Graph->done();
?>

image_graph3


使用不同的字体和文字
image_graph4.php

addNew(‘plotarea’);
$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5, ‘J’);
$Dataset->addPoint(‘Feb’, 13, ‘F’);
$Dataset->addPoint(‘March’, 10, ‘M’);
$Plot =& $Plotarea->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setBackgroundColor(‘green@0.1’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot->setFillStyle($fill);

$Font =& $Graph->addNew(‘ttf_font’, ‘Bitstream-Vera-Sans-Mono’);
$Font->setSize(12);
$Graph->setFont($Font);

$YAxis =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$YAxis->setTitle(‘Rainy Days’, ‘vertical’);
$XAxis =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X);
$XAxis->setTitle(‘Month’);

$Graph->done();
?>

image_graph4

这里,我们使用了ttf 字体Bitstream-Vera-Sans-Mono, 字号12. 通常会有这样的错误提示信息:
Warning: imagettfbbox(): Could not find/open font in /usr/share/php/Image/Canvas/GD.php on line 1245
这主要是因为你没有把字体文件放到字体目录php/Image/Canvas/Fonts/. 上面的例子中,我们需要把Bitstream-Vera-Sans-Mono.ttf文件放到该目录中。

一个图中多个象限(图表)
如前面提到,在一个图中我们可以生成多个图表,也可以说多个象限,参考下面的范例:
image_graph5.php

add(
Image_Graph::horizontal(
Image_Graph::vertical(
$PlotareaTopLeft = Image_Graph::factory(‘plotarea’),
$PlotareaBottomLeft = Image_Graph::factory(‘plotarea’),
60
),
$PlotareaRight = Image_Graph::factory(‘plotarea’),
30
)
);

$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5, ‘J’);
$Dataset->addPoint(‘Feb’, 13, ‘F’);
$Dataset->addPoint(‘March’, 10, ‘M’);
$Plot =& $PlotareaRight->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setBackgroundColor(‘green@0.1’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot->setFillStyle($fill);

$Font =& $Graph->addNew(‘ttf_font’, ‘Bitstream-Vera-Sans-Mono’);
$Font->setSize(12);
$Graph->setFont($Font);

$YAxis =& $PlotareaRight->getAxis(IMAGE_GRAPH_AXIS_Y);
$YAxis->setTitle(‘Rainy Days’, ‘vertical’);
$XAxis =& $PlotareaRight->getAxis(IMAGE_GRAPH_AXIS_X);
$XAxis->setTitle(‘Month’);

//2nd Plotarea
$Plot2 =& $PlotareaTopLeft->addNew(‘pie’, &$Dataset);
$Plot2->setLineColor(‘green’);
$Plot2->setBackgroundColor(‘green@0.2’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot2->setFillStyle($fill);

//3rd Plotarea
$Plot3 =& $PlotareaBottomLeft->addNew(‘line’, &$Dataset);
$Plot3->setLineColor(‘green’);
$Plot3->setBackgroundColor(‘green@0.3’);

$Graph->done();
?>

image_graph5

首先我们纵向分成两个部分,一个占据30%,一个占据60%,利用同样的数据源,我们生成不同表现方式的图表。 这里我们使用了饼图和曲线图,Image_Graph为我们提供了非常多的表现方式,大致有下面这些:
line (Image_Graph_Plot_Line)
area (Image_Graph_Plot_Area)
bar (Image_Graph_Plot_Bar)
smooth_line (Image_Graph_Plot_Smoothed_Line)
smooth_area (Image_Graph_Plot_Smoothed_Area)
pie (Image_Graph_Plot_Pie)
step (Image_Graph_Plot_Step)
impulse (Image_Graph_Plot_Impulse)
dot (Image_Graph_Plot_Dot)
scatter, a synonym for dot
radar (Image_Graph_Plot_Radar)
Image_Graph_Plot_CandleStick
Image_Graph_Plot_Band

标题
我们为图表增加一个标题:

add(
Image_Graph::vertical(
Image_Graph::factory(‘title’,array(‘3 graph rainy day’,12)),
Image_Graph::horizontal(
Image_Graph::vertical(
$PlotareaTopLeft = Image_Graph::factory(‘plotarea’),
$PlotareaBottomLeft = Image_Graph::factory(‘plotarea’),
60
),
$PlotareaRight = Image_Graph::factory(‘plotarea’),
30
),
5
)
);

$Dataset =& Image_Graph::factory(‘dataset’);
$Dataset->addPoint(‘Jan’, 5, ‘J’);
$Dataset->addPoint(‘Feb’, 13, ‘F’);
$Dataset->addPoint(‘March’, 10, ‘M’);
$Plot =& $PlotareaRight->addNew(‘bar’, &$Dataset);

$Plot->setLineColor(‘green’);
$Plot->setBackgroundColor(‘green@0.1’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot->setFillStyle($fill);

$Font =& $Graph->addNew(‘ttf_font’, ‘Bitstream-Vera-Sans-Mono’);
$Font->setSize(12);
$Graph->setFont($Font);

$YAxis =& $PlotareaRight->getAxis(IMAGE_GRAPH_AXIS_Y);
$YAxis->setTitle(‘Rainy Days’, ‘vertical’);
$XAxis =& $PlotareaRight->getAxis(IMAGE_GRAPH_AXIS_X);
$XAxis->setTitle(‘Month’);

//2nd Plotarea
$Plot2 =& $PlotareaTopLeft->addNew(‘pie’, &$Dataset);
$Plot2->setLineColor(‘green’);
$Plot2->setBackgroundColor(‘green@0.2’);

$fill =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
$fill->addColor(‘red’, ‘J’);
$fill->addColor(‘blue’, ‘F’);
$fill->addColor(‘yellow’, ‘M’);
$Plot2->setFillStyle($fill);

//3rd Plotarea
$Plot3 =& $PlotareaBottomLeft->addNew(‘line’, &$Dataset);
$Plot3->setLineColor(‘green’);
$Plot3->setBackgroundColor(‘green@0.3’);

$Graph->done();
?>

image_graph6

有关Image_Graph的入门介绍就到这里,接下来我会整理一个高级应用的文档给大家分享!

参考资料来自phpbuilder.com