该类可以生成饼状图(2D/3D),柱状图(2D/3D),以及折线图,可控制输出至浏览器或文件,控制输出的jpeg图像的质量。
所有的设置工作只有5个函数:
1。图表背景色设置setbgcolor()
2。图表参数设置setchartdata()
2。图表标题设置settitle()
3。图表注释设置setdesc()
4。图表图形设置setgraphics()
详细的设置参数请参考文档注释或是后面的测试页面demo.php
<?
php
/* *
* PLChart - PHP图表生成工具 - Create charts in PHP
*
* ====================================================================
* Filename : plchart.php
* Summary: PLChart图表类文件 - PLChart class file
* Author: zeroleonhart ( msn:zeroleonhart@hotmail.com )
* Version: 0.060811
* Copyright (c)2006 zeroleonhart@hotmail.com
* ====================================================================
*
*
*/
class plchart
{
// ============================ 参数定义 - define references ============================
// 图表变量 - chart variable
var $chart ;
// 图表类型 - chart type
var $type ;
// 3D效果 - 3D effect
var $d3d ;
// 图表宽度 - chart width
var $width ;
// 图表高度 - chart height
var $height ;
// 图表质量 - chart quality
var $quality ;
// 图表背景色 - image backgroundcolor
var $bgcolor = array ();
// 图表参数 - chart parameter
var $param = array ();
// 保存为文件的路径 - saving file directory
var $savefile ;
// 图形参数 - graphics references
var $graphics = array ();
// 标题参数 - title references
var $title = array ();
// 注释参数 - description references
var $desc = array ();
// 图表颜色数组 - colors array in chart
var $colors = array ();
// 颜色定义 - define color
var $colordefine = array (
" lightgray " => array ( 192 , 192 , 192 ) ,
" darkgray " => array ( 144 , 144 , 144 ) ,
" lightred " => array ( 255 , 0 , 0 ) ,
" darkred " => array ( 128 , 0 , 0 ) ,
" lightgreen " => array ( 0 , 255 , 0 ) ,
" darkgreen " => array ( 0 , 80 , 0 ) ,
" lightblue " => array ( 0 , 0 , 255 ) ,
" darkblue " => array ( 0 , 0 , 80 ) ,
" lightyellow " => array ( 255 , 255 , 0 ) ,
" darkyellow " => array ( 200 , 200 , 50 ) ,
" lightcyan " => array ( 0 , 255 , 255 ) ,
" darkcyan " => array ( 0 , 90 , 90 ) ,
);
// ============================ 设置函数 - setting functions ============================
/*
* @todo 设置图像背景色 - set the backgroundcolor of the chart image
*
* @param int $red
* @param int $green
* @param int $blue
*
*/
function setbgcolor( $red = 0 , $green = 0 , $blue = 0 )
{
$this -> bgcolor[ 0 ] = $red ;
$this -> bgcolor[ 1 ] = $green ;
$this -> bgcolor[ 2 ] = $blue ;
}
/*
* @todo 设置图像参数 - set the parameters of the chart image
*
* @param string $type
* @param int $d3d
* @param int $width
* @param int $height
* @param int $quality
* @param array $data
* @param string $savefile
*
*/
function setchartdata( $type = " pie " , $d3d = 1 , $width = 400 , $height = 400 , $quality = 70 , $data = array () , $savefile = '' )
{
$this -> type = $type ; // 图表类型 - type of the chart : pie, column, line
$this -> d3d = $d3d ; // 3D效果 -
$this -> width = $width ; // 图表宽度
$this -> height = $height ; // 图表高度
$this -> quality = $quality ; // 图表显示质量
$this -> param = $data ; // 源数据数组
$this -> savefile = $savefile ; // 保存文件路径
}
/*
* @todo 设置图像标题 - set the title of the chart
*
* @param string $tstring
* @param float $tfontsize
* @param float $tangle
* @param int $tposx
* @param int $tposy
* @param string $tfontfile
* @param int $tfred
* @param int $tfgreen
* @param int $tfblue
*
*/
function settitle( $tstring = '' , $tfontsize = 20 , $tangle = 0 , $tposx = 10 , $tposy = 20 , $tfontfile = ' c:/windows/fonts/simhei.ttf ' , $tfred = 0 , $tfgreen = 0 , $tfblue = 0 )
{
$this -> title = array ( $tfontsize , $tangle , $tposx , $tposy , $tfontfile , $tstring , $tfred , $tfgreen , $tfblue );
}
/*
* @todo 设置图像注释 - set the decsription of the chart
*
* @param int $dposx
* @param int $dposy
* @param int $dwidth
* @param int $dheight
* @param int $dmargin
* @param int $dsize
* @param int $dangle
* @param string $dfontfile
* @param int $dfred
* @param int $dfgreen
* @param int $dfblue
*
*/
function setdesc( $dposx = 0 , $dposy = 0 , $dwidth = 100 , $dheight = 300 , $dmargin = 10 , $dsize = 10 , $dangle = 0 , $dfontfile = ' c:/windows/fonts/simhei.ttf ' , $dfred = 0 , $dfgreen = 0 , $dfblue = 0 )
{
$this -> desc = array ( $dposx , $dposy , $dwidth , $dheight , $dmargin , $dsize , $dangle , $dfontfile , $dfred , $dfgreen , $dfblue );
}
/*
* @todo 设置图形 - set the graphics of the chart
*
* @param int $gstartx
* @param int $gstarty
* @param int $gwidth
* @param int $gheight
* @param int $gmargin
* @param float $shadow
*
*/
function setgraphics( $gstartx = 0 , $gstarty = 0 , $gwidth = 100 , $gheight = 100 , $gmargin = 10 , $shadow = 0.1 )
{
$this -> graphics = array ( $gstartx , $gstarty , $gwidth , $gheight , $gmargin , $shadow );
}
// ============================ 生成函数 - build functions ============================
/*
* @todo 生成图表实例 - build chart object
*
*/
function buildchart()
{
// 图像头信息 - header of the image file
header ( " Content-type: image/jpeg " );
// 建立图像 - create image
$this -> chart = imagecreatetruecolor( $this -> width , $this -> height);
// 填充背景色 - set backgroundcolor
$bgc = imagecolorallocate( $this -> chart , $this -> bgcolor[ 0 ] , $this -> bgcolor[ 1 ] , $this -> bgcolor[ 2 ]);
imagefill( $this -> chart , 0 , 0 , $bgc );
// 定义颜色 - allocate colors in the graphics
foreach ( $this -> colordefine as $key => $value )
{
$ $key = imagecolorallocate( $this -> chart , $value [ 0 ] , $value [ 1 ] , $value [ 2 ]);
array_push ( $this -> colors , $ $key ); // 颜色变量入栈 - add color variables into array
}
}
/*
* @todo 生成图表标题 - build title of the chart
*
*/
function buildtitle()
{
// 设置标题颜色 - set title color
$titlecolor = imagecolorallocate( $this -> chart , $this -> title[ 6 ] , $this -> title[ 7 ] , $this -> title[ 8 ]);
// 写标题 - write title
imagettftext( $this -> chart , $this -> title[ 0 ] , $this -> title[ 1 ] , $this -> title[ 2 ] , $this -> title[ 3 ] , $titlecolor , $this -> title[ 4 ] , $this -> title[ 5 ]);
}
/*
* @todo 生成图表说明 - build description of the chart
*
*/
function builddesc()
{
// 注释位置变量 - image position variables
$dposx = $this -> desc[ 0 ];
$dposy = $this -> desc[ 1 ]; // 注释起始坐标 - the start position of the description
$w = $this -> desc[ 2 ]; // 注释部分宽度 - width of all description
$h = $this -> desc[ 3 ]; // 注释部分高度 - height of all description
$num = count ( $this -> param); // 注释数量 - number of description lines
$perh = round ( $h / $num ); // 每行注释的平均高度 - height of each description line
$margin = $this -> desc[ 4 ]; // 注释的间距 - margin between square and font
$dsize = $this -> desc[ 5 ]; // 注释的字体大小 - font size of description
$dangle = $this -> desc[ 6 ]; // 注释的字体角度 - font display angle of description
$dfontfile = $this -> desc[ 7 ]; // 注释的字体文件 - font file of description
$dfcolor = imagecolorallocate( $this -> chart , $this -> desc[ 8 ] , $this -> desc[ 9 ] , $this -> desc[ 10 ]); // 注释的字体颜色 - font color of description
// 写注释 - write description
$dstring = array_keys ( $this -> param);
for ( $i = 0 ; $i < $num ; $i ++ )
{
// 矩形色块 - colorful square
imagefilledrectangle( $this -> chart , $dposx , $dposy , $dposx + $dsize , $dposy + $dsize , $this -> colors[ $i * 2 ]);
// 写文字 - write string
imagettftext( $this -> chart , $dsize , $dangle , $dposx + $dsize + $margin , $dposy + $dsize , $dfcolor , $dfontfile , $dstring [ $i ] . " - " . $this -> param[ $dstring [ $i ]]);
// 下移 - move down to write next description
$dposy += $perh ;
}
}
/*
* @todo 生成图形 - build graphics of the chart
*
* @param source $chart
* @param int $d3d
* @param array $param
* @param array $colordefine
*
*/
function buildgraphics()
{
// 定义生成图形函数 - define make graphics function
// ==================== 饼状图 - pie ====================
if ( $this -> type == " pie " )
{
// 取得图形位置 - get the positoin of the graphics
$posx = $this -> graphics[ 0 ];
$posy = $this -> graphics[ 1 ];
// 取得图形宽度和高度 - get width and height of the graphics
$w = $this -> graphics[ 2 ];
$h = $this -> graphics[ 3 ];
// 图形边距 - graphics margin
$margin = $this -> graphics[ 4 ];
// 3D阴影高度对于椭圆高度的比例 - percent of 3D effect shadow height as the height of the ellipse
$shadow = $this -> graphics[ 5 ];
// 图形位置变量 - image position variables
$centerx = round ( $posx + $w / 2 + $margin );
$centery = round ( $posy + $h / 2 + $margin ); // 椭圆中心坐标 - the center of the ellipse
// 数据处理 - data process
$total = array_sum ( $this -> param); // 取得总数 - get total
$percent = array ( 0 ); // 保存比例 - save each percent
$temp = 0 ;
foreach ( $this -> param as $v )
{
$temp += 360 * ( $v / $total );
array_push ( $percent , $temp ); // 保存角度 - save angle
}
// 生成饼状图 - make pie chart
// 生成3D饼状图 - make 3D pie chart
if ( $this -> d3d == 1 )
{
// 3D阴影 - make 3D shadow
for ( $j = ( $centery * ( 1 + $shadow )); $j > $centery ; $j -- )
{
for ( $k = 0 ; $k < count ( $percent ) - 1 ; $k ++ )
{
imagefilledarc( $this -> chart , $centerx , $j , $w , $h , $percent [ $k ] , $percent [ $k + 1 ] , $this -> colors[ $k * 2 + 1 ] , IMG_ARC_NOFILL);
}
}
}
// 生成平面饼状图 - make 2D pie chart
for ( $i = 0 ; $i < count ( $percent ) - 1 ; $i ++ )
{
imagefilledarc( $this -> chart , $centerx , $centery , $w , $h , $percent [ $i ] , $percent [ $i + 1 ] , $this -> colors[ $i * 2 ] , IMG_ARC_PIE);
}
}
// ==================== 柱状图 - column ====================
elseif ( $this -> type == " column " )
{
// 取得图形位置 - get the positoin of the graphics
$posx = $this -> graphics[ 0 ];
$posy = $this -> graphics[ 1 ];
// 取得图形宽度和高度 - get width and height of the graphics
$w = $this -> graphics[ 2 ];
$h = $this -> graphics[ 3 ];
// 图形边距 - graphics margin
$margin = $this -> graphics[ 4 ];
// 3D阴影高度对于柱体宽度的比例 - percent of 3D effect shadow height as the width of the column
$shadow = $this -> graphics[ 5 ];
// 图形位置变量 - image position variables
$startx = round ( $posx + $margin );
$starty = round ( $posy + $h - $margin ); // 图形左下角坐标 - the left-bottom position of the graphics
// 数据处理 - data process
$maxvalue = max ( $this -> param); // 取得最大值 - get max value
$num = count ( $this -> param); // 取得条柱个数 - get number of columns
$multiple = floor ( log10 ( $maxvalue )); // 取得数值区间 - get data field
$field = floor ( $maxvalue / pow ( 10 , $multiple )) + 1 ; // 区间数 - number of unit fields
$fieldnumber = $field > 5 ? $field : 5 ; // 数据区域数量 - number of data fields
$topvalue = $field * pow ( 10 , $multiple ); // 图表最高点数值 - value of the top
$unitx = ( $w - $margin * 2 ) / $num ; // 取得x单位长度 - get x unit length
$unity = ( $h - $margin * 2 ) / $fieldnumber ; // 取得y单位长度 - get y unit length
$shadowheight = $unitx / 2 * $shadow ; // 阴影宽度 - shadow height
// 初始化坐标系 - initialize reference frame
if ( $this -> d3d == 1 ) // 3D效果 - 3D effect
{
imagefilledpolygon( $this -> chart , array ( $startx , $starty , $startx + $shadowheight , $starty - $shadowheight , $startx + $shadowheight , $posy - $shadowheight , $startx , $posy ) , 4 , $this -> colors[ 0 ]);
imageline( $this -> chart , $startx + $shadowheight , $starty - $shadowheight , $startx + $shadowheight , $posy - $shadowheight , $this -> colors[ 1 ]);
}
imageline( $this -> chart , $startx , $starty , $posx + $w , $starty , $this -> colors[ 1 ]); // x
imageline( $this -> chart , $startx , $starty , $startx , $posy , $this -> colors[ 1 ]); // y
// 区间标识 - declare fields
for ( $i = 0 ; $i <= $fieldnumber ; $i ++ )
{
// 区间标识线 - lines declaring fields
// 3D效果 - 3D effect
if ( $this -> d3d == 1 )
{
imageline( $this -> chart , $startx , $starty - $unity * $i , $startx + $shadowheight , $starty - $unity * $i - $shadowheight , $this -> colors[ 1 ]);
imageline( $this -> chart , $startx + $shadowheight , $starty - $unity * $i - $shadowheight , $posx + $w + $shadowheight , $starty - $unity * $i - $shadowheight , $this -> colors[ 1 ]);
}
// 2D - 2D
else
{
imageline( $this -> chart , $startx , $starty - $unity * $i , $posx + $w , $starty - $unity * $i , $this -> colors[ 0 ]);
}
// 区间说明 - field description
imagettftext( $this -> chart , $this -> desc[ 5 ] , $this -> desc[ 6 ] , $posx , $starty - $unity * $i , $this -> colors[ 0 ] , $this -> desc[ 7 ] , $topvalue / $fieldnumber * $i );
}
// 生成条柱 - make columns
$paramkeys = array_keys ( $this -> param);
for ( $j = 0 ; $j < $num ; $j ++ )
{
$columnheight = ( $h - $margin * 2 ) * ( $this -> param[ $paramkeys [ $j ]] / $topvalue ); // 条柱高度 - column height
$columnx = $startx + $unitx / 4 + $unitx * $j ; // 条柱起点x坐标 - x coordinate of column
imagefilledrectangle( $this -> chart , $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - 1 , $this -> colors[ $j * 2 ]); // 画条柱 - draw columns
// 3D效果 - 3D effect
if ( $this -> d3d == 1 )
{
// 轮廓线 - contour line
imagerectangle( $this -> chart , $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - 1 , $this -> colors[ $j * 2 + 1 ]);
// 3D表面 - 3D top
imagefilledpolygon( $this -> chart , array ( $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - $columnheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $shadowheight , $starty - $columnheight - $shadowheight ) , 4 , $this -> colors[ $j * 2 ]);
imagepolygon( $this -> chart , array ( $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - $columnheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $shadowheight , $starty - $columnheight - $shadowheight ) , 4 , $this -> colors[ $j * 2 + 1 ]);
// 3D阴影 - 3D shadow
imagefilledpolygon( $this -> chart , array ( $columnx + $unitx / 2 , $starty , $columnx + $unitx / 2 + $shadowheight , $starty - $shadowheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $unitx / 2 , $starty - $columnheight ) , 4 , $this -> colors[ $j * 2 + 1 ]);
imagepolygon( $this -> chart , array ( $columnx + $unitx / 2 , $starty , $columnx + $unitx / 2 + $shadowheight , $starty - $shadowheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $unitx / 2 , $starty - $columnheight ) , 4 , $this -> colors[ $j * 2 + 1 ]);
}
}
}
// ==================== 曲线图 - line ====================
else
{
// 取得图形位置 - get the positoin of the graphics
$posx = $this -> graphics[ 0 ];
$posy = $this -> graphics[ 1 ];
// 取得图形宽度和高度 - get width and height of the graphics
$w = $this -> graphics[ 2 ];
$h = $this -> graphics[ 3 ];
// 图形边距 - graphics margin
$margin = $this -> graphics[ 4 ];
// 每个点的直径 - diameter of each point
$pointsize = $this -> graphics[ 5 ] * 20 ;
// 图形位置变量 - image position variables
$startx = round ( $posx + $margin );
$starty = round ( $posy + $h - $margin ); // 图形左下角坐标 - the left-bottom position of the graphics
// 数据处理 - data process
$maxvalue = max ( $this -> param); // 取得最大值 - get max value
$minvalue = min ( $this -> param); // 取得最小值 - get min value
$num = count ( $this -> param); // 取得点个数 - get number of points
$fieldnumber = $num ; // 数据区域数量 - number of data fields
$fielddata = $maxvalue - $minvalue ; // 取得数据区间 - get data field
$unitdata = $fielddata / $fieldnumber ; // 取得单位区间数值 - get unit field data value
$unitx = ( $w - $margin * 2 ) / $num ; // 取得x单位长度 - get x unit length
$unity = ( $h - $margin * 2 ) / $fieldnumber ; // 取得y单位长度 - get y unit length
// 初始化坐标系 - initialize reference frame
imageline( $this -> chart , $startx , $starty , $posx + $w , $starty , $this -> colors[ 1 ]); // x
imageline( $this -> chart , $startx , $starty , $startx , $posy , $this -> colors[ 1 ]); // y
// 区间标识 - declare fields
for ( $i = 0 ; $i <= $fieldnumber ; $i ++ )
{
// 标识线 - declaring fields line
imageline( $this -> chart , $startx , $starty - $unity * $i , $posx + $w , $starty - $unity * $i , $this -> colors[ 0 ]);
// 区间说明 - field description
imagettftext( $this -> chart , $this -> desc[ 5 ] , $this -> desc[ 6 ] , $posx , $starty - $unity * $i , $this -> colors[ 0 ] , $this -> desc[ 7 ] , $minvalue + $unitdata * $i );
}
// 生成线条 - make line
$paramkeys = array_keys ( $this -> param);
$loca = array (); // 保存轨迹的数组 - array to save locas
for ( $i = 0 ; $i < $num ; $i ++ ) // 得到轨迹数组 - get loca array
{
// 点x坐标 - x coordinate of the point
$pointx = $startx + $unitx * $i ;
// 点y坐标 - y coordinate of the point
$pointy = $starty - $unity * $fieldnumber * (( $this -> param[ $paramkeys [ $i ]] - $minvalue ) / $fielddata );
// 坐标数据入栈 - push coordinates into array
$loca [ $i * 2 ] = $pointx ;
$loca [ $i * 2 + 1 ] = $pointy ;
// 画点 - draw point
imagefilledellipse( $this -> chart , $pointx , $pointy , $pointsize , $pointsize , $this -> colors[ $i * 2 ]);
}
$linecolor = imagecolorallocate( $this -> chart , $this -> title[ 6 ] , $this -> title[ 7 ] , $this -> title[ 8 ]); // 定义线条颜色 - define line color
for ( $i = 0 ; $i < $num + 3 ; )
{
// 画线条 - draw line
imageline( $this -> chart , $loca [ $i ] , $loca [ $i + 1 ] , $loca [ $i + 2 ] , $loca [ $i + 3 ] , $linecolor );
$i += 2 ;
}
}
}
/*
* @todo 输出图像至浏览器或文件 - output the chart image to browser or file
*/
function outputchart()
{
// 建立图标 - build chart
$this -> buildchart();
// 写入图形 - build graphics
$this -> buildgraphics();
// 写入注释 - build description
$this -> builddesc();
// 写入标题 - build title
$this -> buildtitle();
// 输出图像 - flush image
imagejpeg( $this -> chart , $this -> savefile , $this -> quality);
imagedestroy( $this -> chart);
}
}
?>
*********************************************************************************
演示文件demo . php :
**********************************************************************************
<? php
// 载入类文件
include ( ' plchart.php ' );
// 设置数据数组
$data = array ( " 1月份:11% " => 20 , " 2月份:16% " => 23 , " 3月份:19% " => 27 , " 4月份:13% " => 18 , " 5月份:18% " => 24 , " 6月份:12% " => 25 );
// 实例化
$chart = new plchart();
// 设置背景色
// 三个参数为0-255
$chart -> setbgcolor( 255 , 255 , 255 );
// 设置标题文字
$title = <<< string
图表测试
TEST PIE CHART
string ;
// 设置图表数据
/*
* 第一个参数为图表类型,只能是三个值:pie, column, line
* 第二个参数为是否启用3D显示,0代表不启用,1代表启动
* 第三个参数为图表的宽度
* 第四个参数为图表的高度
* 第五个参数为图表的图片质量,0-100,100为最佳质量,但文件相对也最大
* 第六个参数为原数据数组
*/
$chart -> setchartdata( " line " , 0 , 800 , 600 , 100 , $data );
// 设置标题
/*
* 第一个参数为标题的字符串
* 第二个参数为标题字体大小
* 第三个参数为标题倾斜角度
* 第四个参数为标题位于图表的起始横坐标
* 第五个参数为标题文字的基准纵坐标
* 第六个参数为标题字体文件
* 最后三个参数为标题字体的RGB颜色
*/
$chart -> settitle( $title , 20 , 0 , 10 , 20 , ' c:/windows/fonts/simhei.ttf ' , 0 , 0 , 0 );
// 设置注释
/*
* 第一个参数为注释位于图表的起始横坐标
* 第二个参数为注释位于图表的起始纵坐标
* 第三个参数为注释部分的宽度
* 第四个参数为注释部分的高度
* 第五个参数为注释内容与注释部分边框的间距
* 第六个参数为注释字体大小
* 第七个参数为注释字体倾斜角度
* 第六个参数为注释字体文件
* 最后三个参数为注释字体的RGB颜色
*/
$chart -> setdesc( 500 , 100 , 200 , 300 , 10 , 18 , 0 , ' c:/windows/fonts/simhei.ttf ' , 0 , 0 , 0 );
// 设置图形
/*
* 第一个参数为图形部分位于整个图表的左上角横坐标
* 第二个参数为图形部分位于整个图表的左上角纵坐标
* 第三个参数为图形部分的宽度
* 第四个参数为图形部分的高度
* 第五个参数为图形与图形部分边框的间距(纵坐标标记的宽度)
* 第六个参数为3D阴影的相对比例或是轨迹图中圆点的直径
*/
$chart -> setgraphics( 10 , 100 , 500 , 500 , 50 , 0.3 );
// 输出图表
$chart -> outputchart();
// 销毁实例
unset ( $chart );
?>
/* *
* PLChart - PHP图表生成工具 - Create charts in PHP
*
* ====================================================================
* Filename : plchart.php
* Summary: PLChart图表类文件 - PLChart class file
* Author: zeroleonhart ( msn:zeroleonhart@hotmail.com )
* Version: 0.060811
* Copyright (c)2006 zeroleonhart@hotmail.com
* ====================================================================
*
*
*/
class plchart
{
// ============================ 参数定义 - define references ============================
// 图表变量 - chart variable
var $chart ;
// 图表类型 - chart type
var $type ;
// 3D效果 - 3D effect
var $d3d ;
// 图表宽度 - chart width
var $width ;
// 图表高度 - chart height
var $height ;
// 图表质量 - chart quality
var $quality ;
// 图表背景色 - image backgroundcolor
var $bgcolor = array ();
// 图表参数 - chart parameter
var $param = array ();
// 保存为文件的路径 - saving file directory
var $savefile ;
// 图形参数 - graphics references
var $graphics = array ();
// 标题参数 - title references
var $title = array ();
// 注释参数 - description references
var $desc = array ();
// 图表颜色数组 - colors array in chart
var $colors = array ();
// 颜色定义 - define color
var $colordefine = array (
" lightgray " => array ( 192 , 192 , 192 ) ,
" darkgray " => array ( 144 , 144 , 144 ) ,
" lightred " => array ( 255 , 0 , 0 ) ,
" darkred " => array ( 128 , 0 , 0 ) ,
" lightgreen " => array ( 0 , 255 , 0 ) ,
" darkgreen " => array ( 0 , 80 , 0 ) ,
" lightblue " => array ( 0 , 0 , 255 ) ,
" darkblue " => array ( 0 , 0 , 80 ) ,
" lightyellow " => array ( 255 , 255 , 0 ) ,
" darkyellow " => array ( 200 , 200 , 50 ) ,
" lightcyan " => array ( 0 , 255 , 255 ) ,
" darkcyan " => array ( 0 , 90 , 90 ) ,
);
// ============================ 设置函数 - setting functions ============================
/*
* @todo 设置图像背景色 - set the backgroundcolor of the chart image
*
* @param int $red
* @param int $green
* @param int $blue
*
*/
function setbgcolor( $red = 0 , $green = 0 , $blue = 0 )
{
$this -> bgcolor[ 0 ] = $red ;
$this -> bgcolor[ 1 ] = $green ;
$this -> bgcolor[ 2 ] = $blue ;
}
/*
* @todo 设置图像参数 - set the parameters of the chart image
*
* @param string $type
* @param int $d3d
* @param int $width
* @param int $height
* @param int $quality
* @param array $data
* @param string $savefile
*
*/
function setchartdata( $type = " pie " , $d3d = 1 , $width = 400 , $height = 400 , $quality = 70 , $data = array () , $savefile = '' )
{
$this -> type = $type ; // 图表类型 - type of the chart : pie, column, line
$this -> d3d = $d3d ; // 3D效果 -
$this -> width = $width ; // 图表宽度
$this -> height = $height ; // 图表高度
$this -> quality = $quality ; // 图表显示质量
$this -> param = $data ; // 源数据数组
$this -> savefile = $savefile ; // 保存文件路径
}
/*
* @todo 设置图像标题 - set the title of the chart
*
* @param string $tstring
* @param float $tfontsize
* @param float $tangle
* @param int $tposx
* @param int $tposy
* @param string $tfontfile
* @param int $tfred
* @param int $tfgreen
* @param int $tfblue
*
*/
function settitle( $tstring = '' , $tfontsize = 20 , $tangle = 0 , $tposx = 10 , $tposy = 20 , $tfontfile = ' c:/windows/fonts/simhei.ttf ' , $tfred = 0 , $tfgreen = 0 , $tfblue = 0 )
{
$this -> title = array ( $tfontsize , $tangle , $tposx , $tposy , $tfontfile , $tstring , $tfred , $tfgreen , $tfblue );
}
/*
* @todo 设置图像注释 - set the decsription of the chart
*
* @param int $dposx
* @param int $dposy
* @param int $dwidth
* @param int $dheight
* @param int $dmargin
* @param int $dsize
* @param int $dangle
* @param string $dfontfile
* @param int $dfred
* @param int $dfgreen
* @param int $dfblue
*
*/
function setdesc( $dposx = 0 , $dposy = 0 , $dwidth = 100 , $dheight = 300 , $dmargin = 10 , $dsize = 10 , $dangle = 0 , $dfontfile = ' c:/windows/fonts/simhei.ttf ' , $dfred = 0 , $dfgreen = 0 , $dfblue = 0 )
{
$this -> desc = array ( $dposx , $dposy , $dwidth , $dheight , $dmargin , $dsize , $dangle , $dfontfile , $dfred , $dfgreen , $dfblue );
}
/*
* @todo 设置图形 - set the graphics of the chart
*
* @param int $gstartx
* @param int $gstarty
* @param int $gwidth
* @param int $gheight
* @param int $gmargin
* @param float $shadow
*
*/
function setgraphics( $gstartx = 0 , $gstarty = 0 , $gwidth = 100 , $gheight = 100 , $gmargin = 10 , $shadow = 0.1 )
{
$this -> graphics = array ( $gstartx , $gstarty , $gwidth , $gheight , $gmargin , $shadow );
}
// ============================ 生成函数 - build functions ============================
/*
* @todo 生成图表实例 - build chart object
*
*/
function buildchart()
{
// 图像头信息 - header of the image file
header ( " Content-type: image/jpeg " );
// 建立图像 - create image
$this -> chart = imagecreatetruecolor( $this -> width , $this -> height);
// 填充背景色 - set backgroundcolor
$bgc = imagecolorallocate( $this -> chart , $this -> bgcolor[ 0 ] , $this -> bgcolor[ 1 ] , $this -> bgcolor[ 2 ]);
imagefill( $this -> chart , 0 , 0 , $bgc );
// 定义颜色 - allocate colors in the graphics
foreach ( $this -> colordefine as $key => $value )
{
$ $key = imagecolorallocate( $this -> chart , $value [ 0 ] , $value [ 1 ] , $value [ 2 ]);
array_push ( $this -> colors , $ $key ); // 颜色变量入栈 - add color variables into array
}
}
/*
* @todo 生成图表标题 - build title of the chart
*
*/
function buildtitle()
{
// 设置标题颜色 - set title color
$titlecolor = imagecolorallocate( $this -> chart , $this -> title[ 6 ] , $this -> title[ 7 ] , $this -> title[ 8 ]);
// 写标题 - write title
imagettftext( $this -> chart , $this -> title[ 0 ] , $this -> title[ 1 ] , $this -> title[ 2 ] , $this -> title[ 3 ] , $titlecolor , $this -> title[ 4 ] , $this -> title[ 5 ]);
}
/*
* @todo 生成图表说明 - build description of the chart
*
*/
function builddesc()
{
// 注释位置变量 - image position variables
$dposx = $this -> desc[ 0 ];
$dposy = $this -> desc[ 1 ]; // 注释起始坐标 - the start position of the description
$w = $this -> desc[ 2 ]; // 注释部分宽度 - width of all description
$h = $this -> desc[ 3 ]; // 注释部分高度 - height of all description
$num = count ( $this -> param); // 注释数量 - number of description lines
$perh = round ( $h / $num ); // 每行注释的平均高度 - height of each description line
$margin = $this -> desc[ 4 ]; // 注释的间距 - margin between square and font
$dsize = $this -> desc[ 5 ]; // 注释的字体大小 - font size of description
$dangle = $this -> desc[ 6 ]; // 注释的字体角度 - font display angle of description
$dfontfile = $this -> desc[ 7 ]; // 注释的字体文件 - font file of description
$dfcolor = imagecolorallocate( $this -> chart , $this -> desc[ 8 ] , $this -> desc[ 9 ] , $this -> desc[ 10 ]); // 注释的字体颜色 - font color of description
// 写注释 - write description
$dstring = array_keys ( $this -> param);
for ( $i = 0 ; $i < $num ; $i ++ )
{
// 矩形色块 - colorful square
imagefilledrectangle( $this -> chart , $dposx , $dposy , $dposx + $dsize , $dposy + $dsize , $this -> colors[ $i * 2 ]);
// 写文字 - write string
imagettftext( $this -> chart , $dsize , $dangle , $dposx + $dsize + $margin , $dposy + $dsize , $dfcolor , $dfontfile , $dstring [ $i ] . " - " . $this -> param[ $dstring [ $i ]]);
// 下移 - move down to write next description
$dposy += $perh ;
}
}
/*
* @todo 生成图形 - build graphics of the chart
*
* @param source $chart
* @param int $d3d
* @param array $param
* @param array $colordefine
*
*/
function buildgraphics()
{
// 定义生成图形函数 - define make graphics function
// ==================== 饼状图 - pie ====================
if ( $this -> type == " pie " )
{
// 取得图形位置 - get the positoin of the graphics
$posx = $this -> graphics[ 0 ];
$posy = $this -> graphics[ 1 ];
// 取得图形宽度和高度 - get width and height of the graphics
$w = $this -> graphics[ 2 ];
$h = $this -> graphics[ 3 ];
// 图形边距 - graphics margin
$margin = $this -> graphics[ 4 ];
// 3D阴影高度对于椭圆高度的比例 - percent of 3D effect shadow height as the height of the ellipse
$shadow = $this -> graphics[ 5 ];
// 图形位置变量 - image position variables
$centerx = round ( $posx + $w / 2 + $margin );
$centery = round ( $posy + $h / 2 + $margin ); // 椭圆中心坐标 - the center of the ellipse
// 数据处理 - data process
$total = array_sum ( $this -> param); // 取得总数 - get total
$percent = array ( 0 ); // 保存比例 - save each percent
$temp = 0 ;
foreach ( $this -> param as $v )
{
$temp += 360 * ( $v / $total );
array_push ( $percent , $temp ); // 保存角度 - save angle
}
// 生成饼状图 - make pie chart
// 生成3D饼状图 - make 3D pie chart
if ( $this -> d3d == 1 )
{
// 3D阴影 - make 3D shadow
for ( $j = ( $centery * ( 1 + $shadow )); $j > $centery ; $j -- )
{
for ( $k = 0 ; $k < count ( $percent ) - 1 ; $k ++ )
{
imagefilledarc( $this -> chart , $centerx , $j , $w , $h , $percent [ $k ] , $percent [ $k + 1 ] , $this -> colors[ $k * 2 + 1 ] , IMG_ARC_NOFILL);
}
}
}
// 生成平面饼状图 - make 2D pie chart
for ( $i = 0 ; $i < count ( $percent ) - 1 ; $i ++ )
{
imagefilledarc( $this -> chart , $centerx , $centery , $w , $h , $percent [ $i ] , $percent [ $i + 1 ] , $this -> colors[ $i * 2 ] , IMG_ARC_PIE);
}
}
// ==================== 柱状图 - column ====================
elseif ( $this -> type == " column " )
{
// 取得图形位置 - get the positoin of the graphics
$posx = $this -> graphics[ 0 ];
$posy = $this -> graphics[ 1 ];
// 取得图形宽度和高度 - get width and height of the graphics
$w = $this -> graphics[ 2 ];
$h = $this -> graphics[ 3 ];
// 图形边距 - graphics margin
$margin = $this -> graphics[ 4 ];
// 3D阴影高度对于柱体宽度的比例 - percent of 3D effect shadow height as the width of the column
$shadow = $this -> graphics[ 5 ];
// 图形位置变量 - image position variables
$startx = round ( $posx + $margin );
$starty = round ( $posy + $h - $margin ); // 图形左下角坐标 - the left-bottom position of the graphics
// 数据处理 - data process
$maxvalue = max ( $this -> param); // 取得最大值 - get max value
$num = count ( $this -> param); // 取得条柱个数 - get number of columns
$multiple = floor ( log10 ( $maxvalue )); // 取得数值区间 - get data field
$field = floor ( $maxvalue / pow ( 10 , $multiple )) + 1 ; // 区间数 - number of unit fields
$fieldnumber = $field > 5 ? $field : 5 ; // 数据区域数量 - number of data fields
$topvalue = $field * pow ( 10 , $multiple ); // 图表最高点数值 - value of the top
$unitx = ( $w - $margin * 2 ) / $num ; // 取得x单位长度 - get x unit length
$unity = ( $h - $margin * 2 ) / $fieldnumber ; // 取得y单位长度 - get y unit length
$shadowheight = $unitx / 2 * $shadow ; // 阴影宽度 - shadow height
// 初始化坐标系 - initialize reference frame
if ( $this -> d3d == 1 ) // 3D效果 - 3D effect
{
imagefilledpolygon( $this -> chart , array ( $startx , $starty , $startx + $shadowheight , $starty - $shadowheight , $startx + $shadowheight , $posy - $shadowheight , $startx , $posy ) , 4 , $this -> colors[ 0 ]);
imageline( $this -> chart , $startx + $shadowheight , $starty - $shadowheight , $startx + $shadowheight , $posy - $shadowheight , $this -> colors[ 1 ]);
}
imageline( $this -> chart , $startx , $starty , $posx + $w , $starty , $this -> colors[ 1 ]); // x
imageline( $this -> chart , $startx , $starty , $startx , $posy , $this -> colors[ 1 ]); // y
// 区间标识 - declare fields
for ( $i = 0 ; $i <= $fieldnumber ; $i ++ )
{
// 区间标识线 - lines declaring fields
// 3D效果 - 3D effect
if ( $this -> d3d == 1 )
{
imageline( $this -> chart , $startx , $starty - $unity * $i , $startx + $shadowheight , $starty - $unity * $i - $shadowheight , $this -> colors[ 1 ]);
imageline( $this -> chart , $startx + $shadowheight , $starty - $unity * $i - $shadowheight , $posx + $w + $shadowheight , $starty - $unity * $i - $shadowheight , $this -> colors[ 1 ]);
}
// 2D - 2D
else
{
imageline( $this -> chart , $startx , $starty - $unity * $i , $posx + $w , $starty - $unity * $i , $this -> colors[ 0 ]);
}
// 区间说明 - field description
imagettftext( $this -> chart , $this -> desc[ 5 ] , $this -> desc[ 6 ] , $posx , $starty - $unity * $i , $this -> colors[ 0 ] , $this -> desc[ 7 ] , $topvalue / $fieldnumber * $i );
}
// 生成条柱 - make columns
$paramkeys = array_keys ( $this -> param);
for ( $j = 0 ; $j < $num ; $j ++ )
{
$columnheight = ( $h - $margin * 2 ) * ( $this -> param[ $paramkeys [ $j ]] / $topvalue ); // 条柱高度 - column height
$columnx = $startx + $unitx / 4 + $unitx * $j ; // 条柱起点x坐标 - x coordinate of column
imagefilledrectangle( $this -> chart , $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - 1 , $this -> colors[ $j * 2 ]); // 画条柱 - draw columns
// 3D效果 - 3D effect
if ( $this -> d3d == 1 )
{
// 轮廓线 - contour line
imagerectangle( $this -> chart , $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - 1 , $this -> colors[ $j * 2 + 1 ]);
// 3D表面 - 3D top
imagefilledpolygon( $this -> chart , array ( $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - $columnheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $shadowheight , $starty - $columnheight - $shadowheight ) , 4 , $this -> colors[ $j * 2 ]);
imagepolygon( $this -> chart , array ( $columnx , $starty - $columnheight , $columnx + $unitx / 2 , $starty - $columnheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $shadowheight , $starty - $columnheight - $shadowheight ) , 4 , $this -> colors[ $j * 2 + 1 ]);
// 3D阴影 - 3D shadow
imagefilledpolygon( $this -> chart , array ( $columnx + $unitx / 2 , $starty , $columnx + $unitx / 2 + $shadowheight , $starty - $shadowheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $unitx / 2 , $starty - $columnheight ) , 4 , $this -> colors[ $j * 2 + 1 ]);
imagepolygon( $this -> chart , array ( $columnx + $unitx / 2 , $starty , $columnx + $unitx / 2 + $shadowheight , $starty - $shadowheight , $columnx + $unitx / 2 + $shadowheight , $starty - $columnheight - $shadowheight , $columnx + $unitx / 2 , $starty - $columnheight ) , 4 , $this -> colors[ $j * 2 + 1 ]);
}
}
}
// ==================== 曲线图 - line ====================
else
{
// 取得图形位置 - get the positoin of the graphics
$posx = $this -> graphics[ 0 ];
$posy = $this -> graphics[ 1 ];
// 取得图形宽度和高度 - get width and height of the graphics
$w = $this -> graphics[ 2 ];
$h = $this -> graphics[ 3 ];
// 图形边距 - graphics margin
$margin = $this -> graphics[ 4 ];
// 每个点的直径 - diameter of each point
$pointsize = $this -> graphics[ 5 ] * 20 ;
// 图形位置变量 - image position variables
$startx = round ( $posx + $margin );
$starty = round ( $posy + $h - $margin ); // 图形左下角坐标 - the left-bottom position of the graphics
// 数据处理 - data process
$maxvalue = max ( $this -> param); // 取得最大值 - get max value
$minvalue = min ( $this -> param); // 取得最小值 - get min value
$num = count ( $this -> param); // 取得点个数 - get number of points
$fieldnumber = $num ; // 数据区域数量 - number of data fields
$fielddata = $maxvalue - $minvalue ; // 取得数据区间 - get data field
$unitdata = $fielddata / $fieldnumber ; // 取得单位区间数值 - get unit field data value
$unitx = ( $w - $margin * 2 ) / $num ; // 取得x单位长度 - get x unit length
$unity = ( $h - $margin * 2 ) / $fieldnumber ; // 取得y单位长度 - get y unit length
// 初始化坐标系 - initialize reference frame
imageline( $this -> chart , $startx , $starty , $posx + $w , $starty , $this -> colors[ 1 ]); // x
imageline( $this -> chart , $startx , $starty , $startx , $posy , $this -> colors[ 1 ]); // y
// 区间标识 - declare fields
for ( $i = 0 ; $i <= $fieldnumber ; $i ++ )
{
// 标识线 - declaring fields line
imageline( $this -> chart , $startx , $starty - $unity * $i , $posx + $w , $starty - $unity * $i , $this -> colors[ 0 ]);
// 区间说明 - field description
imagettftext( $this -> chart , $this -> desc[ 5 ] , $this -> desc[ 6 ] , $posx , $starty - $unity * $i , $this -> colors[ 0 ] , $this -> desc[ 7 ] , $minvalue + $unitdata * $i );
}
// 生成线条 - make line
$paramkeys = array_keys ( $this -> param);
$loca = array (); // 保存轨迹的数组 - array to save locas
for ( $i = 0 ; $i < $num ; $i ++ ) // 得到轨迹数组 - get loca array
{
// 点x坐标 - x coordinate of the point
$pointx = $startx + $unitx * $i ;
// 点y坐标 - y coordinate of the point
$pointy = $starty - $unity * $fieldnumber * (( $this -> param[ $paramkeys [ $i ]] - $minvalue ) / $fielddata );
// 坐标数据入栈 - push coordinates into array
$loca [ $i * 2 ] = $pointx ;
$loca [ $i * 2 + 1 ] = $pointy ;
// 画点 - draw point
imagefilledellipse( $this -> chart , $pointx , $pointy , $pointsize , $pointsize , $this -> colors[ $i * 2 ]);
}
$linecolor = imagecolorallocate( $this -> chart , $this -> title[ 6 ] , $this -> title[ 7 ] , $this -> title[ 8 ]); // 定义线条颜色 - define line color
for ( $i = 0 ; $i < $num + 3 ; )
{
// 画线条 - draw line
imageline( $this -> chart , $loca [ $i ] , $loca [ $i + 1 ] , $loca [ $i + 2 ] , $loca [ $i + 3 ] , $linecolor );
$i += 2 ;
}
}
}
/*
* @todo 输出图像至浏览器或文件 - output the chart image to browser or file
*/
function outputchart()
{
// 建立图标 - build chart
$this -> buildchart();
// 写入图形 - build graphics
$this -> buildgraphics();
// 写入注释 - build description
$this -> builddesc();
// 写入标题 - build title
$this -> buildtitle();
// 输出图像 - flush image
imagejpeg( $this -> chart , $this -> savefile , $this -> quality);
imagedestroy( $this -> chart);
}
}
?>
*********************************************************************************
演示文件demo . php :
**********************************************************************************
<? php
// 载入类文件
include ( ' plchart.php ' );
// 设置数据数组
$data = array ( " 1月份:11% " => 20 , " 2月份:16% " => 23 , " 3月份:19% " => 27 , " 4月份:13% " => 18 , " 5月份:18% " => 24 , " 6月份:12% " => 25 );
// 实例化
$chart = new plchart();
// 设置背景色
// 三个参数为0-255
$chart -> setbgcolor( 255 , 255 , 255 );
// 设置标题文字
$title = <<< string
图表测试
TEST PIE CHART
string ;
// 设置图表数据
/*
* 第一个参数为图表类型,只能是三个值:pie, column, line
* 第二个参数为是否启用3D显示,0代表不启用,1代表启动
* 第三个参数为图表的宽度
* 第四个参数为图表的高度
* 第五个参数为图表的图片质量,0-100,100为最佳质量,但文件相对也最大
* 第六个参数为原数据数组
*/
$chart -> setchartdata( " line " , 0 , 800 , 600 , 100 , $data );
// 设置标题
/*
* 第一个参数为标题的字符串
* 第二个参数为标题字体大小
* 第三个参数为标题倾斜角度
* 第四个参数为标题位于图表的起始横坐标
* 第五个参数为标题文字的基准纵坐标
* 第六个参数为标题字体文件
* 最后三个参数为标题字体的RGB颜色
*/
$chart -> settitle( $title , 20 , 0 , 10 , 20 , ' c:/windows/fonts/simhei.ttf ' , 0 , 0 , 0 );
// 设置注释
/*
* 第一个参数为注释位于图表的起始横坐标
* 第二个参数为注释位于图表的起始纵坐标
* 第三个参数为注释部分的宽度
* 第四个参数为注释部分的高度
* 第五个参数为注释内容与注释部分边框的间距
* 第六个参数为注释字体大小
* 第七个参数为注释字体倾斜角度
* 第六个参数为注释字体文件
* 最后三个参数为注释字体的RGB颜色
*/
$chart -> setdesc( 500 , 100 , 200 , 300 , 10 , 18 , 0 , ' c:/windows/fonts/simhei.ttf ' , 0 , 0 , 0 );
// 设置图形
/*
* 第一个参数为图形部分位于整个图表的左上角横坐标
* 第二个参数为图形部分位于整个图表的左上角纵坐标
* 第三个参数为图形部分的宽度
* 第四个参数为图形部分的高度
* 第五个参数为图形与图形部分边框的间距(纵坐标标记的宽度)
* 第六个参数为3D阴影的相对比例或是轨迹图中圆点的直径
*/
$chart -> setgraphics( 10 , 100 , 500 , 500 , 50 , 0.3 );
// 输出图表
$chart -> outputchart();
// 销毁实例
unset ( $chart );
?>