gd绘制的三角形统计图的绘制怎么架接到php页面

PHP中使用GD库绘制折线图 折线统计图的绘制方法,gd折线-android100学习网
PHP中使用GD库绘制折线图 折线统计图的绘制方法,gd折线
PHP中使用GD库绘制折线图 折线统计图的绘制方法,gd折线 在PHP中,有一些简单的图像函数是可以直接使用的,但大多数要处理的图像,都需要在编译PHP时加上GD库。除了安装GD库之外,在PHP...
PHP中使用GD库绘制折线图 折线统计图的绘制方法,gd折线
在PHP中,有一些简单的图像函数是可以直接使用的,但大多数要处理的图像,都需要在编译PHP时加上GD库。除了安装GD库之外,在PHP中还可能需要其他的库,这可以根据需要支持哪些图像格式而定。GD库可以在/gd/免费下载,不同的GD版本支持的图像格式不完全一样,最新的GD库版本支持GIF、JPEG、PNG、WBMP、XBM等格式的图像文件,此外还支持一些如FreeType、Type 1等字体库。通过GD库中的函数可以完成各种点、线、几何图形、文本及颜色的操作和处理,也可以创建或读取多种格式的图像文件。
在PHP中,通过GD库处理图像的操作,都是先在内存中处理,操作完成以后再以文件流的方式,输出到浏览器或保存在服务器的磁盘中。创建一个图像应该完成如下所示的4个基本步骤。
(1)创建画布:所有的绘图设计都需要在一个背景图片上完成,而画布实际上就是在内存中开辟的一块临时区域,用于存储图像的信息。以后的图像操作都将基于这个背景画布,该画布的管理就类似于我们在画画时使用的画布。
(2)绘制图像:画布创建完成以后,就可以通过这个画布资源,使用各种画像函数设置图像的颜色、填充画布、画点、线段、各种几何图形,以及向图像中添加文本等。
(3)输出图像:完成整个图像的绘制以后,需要将图像以某种格式保存到服务器指定的文件中,或将图像直接输出到浏览器上显示给用户。但在图像输出之前,一定要使用header()函数发送Content-type通知浏览器,这次发送的是图片不是文本。
(4)释放资源:图像被输出以后,画布中的内容也不再有用。出于节约系统资源的考虑,需要及时清除画布占用的所有内存资源。
php中用GD绘制折线图,代码如下:
Class Chart{
private $ // 定义图像
private $ // 定义标题
private $ // 定义Y轴数据
private $ // 定义X轴数据
private $seriesN // 定义每个系列数据的名称
private $ // 定义条形图颜色
private $ // 定义图片背景颜色
private $ // 定义图片的宽
private $ // 定义图片的长
* 构造函数
* String title 图片标题
* Array xdata 索引数组,X轴数据
* Array ydata 索引数组,数字数组,Y轴数据
* Array series_name 索引数组,数据系列名称
function __construct($title,$xdata,$ydata,$seriesName) {
$this-&title = $
$this-&xdata = $
$this-&ydata = $
$this-&seriesName = $seriesN
$this-&color = array('#DC', '#B', '#EDB', '#DDDF', '#CBE', '#E', '#FF', '#FFF', '#AFC');
* 公有方法,设置条形图的颜色
* Array color 颜色数组,元素取值为'#DC'这种形式
function setBarColor($color){
$this-&color = $
* 绘制折线图
public function paintLineChart() {
$ydataNum = $this-&arrayNum($this-&ydata); // 取得数据分组的个数
$max = $this-&arrayMax($this-&ydata); // 取得所有呈现数据的最大值
$max = ($max & )? $max : ;
$multi = $max/; // 如果最大数据是大于的则进行缩小处理
$barHeightMulti = .; // 条形高缩放的比例
$lineWidth = ;
$chartLeft = (+strlen($max))*; // 设置图片左边的margin
$lineY = ; // 初始化条形图的Y的坐标
// 设置图片的宽、高
//$this-&width = $lineWidth*count($this-&xdata) + $chartLeft - $lineWidth/.;
$margin = ; // 小矩形描述右边margin
$recWidth = ; // 小矩形的宽
$recHeight = ; // 小矩形的高
$space = ; // 小矩形与条形图的间距
$tmpWidth = ;
// 设置图片的宽、高
$lineChartWidth = $lineWidth*count($this-&xdata) + $chartLeft - $lineWidth/. ;
// 两个系列数据以上的加上小矩形的宽
if($ydataNum & ) {
$tmpWidth = $this-&arrayLengthMax($this-&seriesName)**/ + $space + $recWidth + + $
$this-&width = $lineChartWidth + $tmpW
$this-&height = ;
$this-&image = imagecreatetruecolor($this-&width ,$this-&height); // 准备画布
$this-&bgcolor = imagecolorallocate($this-&image,,,); // 图片的背景颜色
// 设置条形图的颜色
$color = array();
foreach($this-&color as $col) {
$col = substr($col,,strlen($col)-);
$red = hexdec(substr($col,,));
$green = hexdec(substr($col,,));
$blue = hexdec(substr($col,,));
$color[] = imagecolorallocate($this-&image ,$red, $green, $blue);
// 设置线段的颜色、字体的颜色、字体的路径
$lineColor = imagecolorallocate($this-&image ,xcc,xcc,xcc);
$fontColor = imagecolorallocate($this-&image, x,xf,xf);
$fontPath = 'font/simsun.ttc';
imagefill($this-&image,,,$this-&bgcolor); // 绘画背景
// 绘画图的分短线与左右边线
for($i = ; $i & ; $i++ ) {
imageline($this-&image,$chartLeft-,$lineY-$barHeightMulti*$max//$multi*$i,$lineChartWidth,$lineY-$barHeightMulti*$max//$multi*$i,$lineColor);
imagestring($this-&image,,,$lineY-$barHeightMulti*$max//$multi*$i-,floor($max/*$i),$fontColor);
imageline($this-&image,$chartLeft-,,$chartLeft-,$lineY,$lineColor);
imageline($this-&image,$lineChartWidth-,,$lineChartWidth-,$lineY,$lineColor);
$style = array($lineColor,$lineColor,$lineColor,$lineColor,$lineColor,$this-&bgcolor,$this-&bgcolor,$this-&bgcolor,$this-&bgcolor,$this-&bgcolor);
imagesetstyle($this-&image,$style);
// 绘制折线图的分隔线(虚线)
foreach($this-&xdata as $key =& $val) {
$lineX = $chartLeft + + $lineWidth*$
imageline($this-&image,$lineX,,$lineX,$lineY,IMG_COLOR_STYLED);
// 绘画图的折线
foreach($this-&ydata as $key =& $val) {
if($ydataNum == ) {
// 一个系列数据时
if($key == count($this-&ydata) - )
$lineX = $chartLeft + + $lineWidth*$
$lineY = $lineY-$barHeightMulti*($this-&ydata[$key+])/$
if($key == count($this-&ydata) - ) {
imagefilledellipse($this-&image,$lineX+$lineWidth,$lineY,,,$color[]);
imageline($this-&image,$lineX,$lineY-$barHeightMulti*$val/$multi,$lineX+$lineWidth,$lineY,$color[]);
imagefilledellipse($this-&image,$lineX,$lineY-$barHeightMulti*$val/$multi,,,$color[]);
}elseif($ydataNum & ) {
// 多个系列的数据时
foreach($val as $ckey =& $cval) {
if($ckey == count($val) - )
$lineX = $chartLeft + + $lineWidth*$
$lineY = $lineY-$barHeightMulti*($val[$ckey+])/$
if($ckey == count($val) - ) {
imagefilledellipse($this-&image,$lineX+$lineWidth,$lineY,,,$color[$key%count($this-&color)]);
imageline($this-&image,$lineX,$lineY-$barHeightMulti*$cval/$multi,$lineX+$lineWidth,$lineY,$color[$key%count($this-&color)]);
imagefilledellipse($this-&image,$lineX,$lineY-$barHeightMulti*$cval/$multi,,,$color[$key%count($this-&color)]);
// 绘画条形图的x坐标的值
foreach($this-&xdata as $key =& $val) {
$lineX = $chartLeft + $lineWidth*$key + $lineWidth/ - ;
imagettftext($this-&image,,-,$lineX,$lineY+,$fontColor,$fontPath,$this-&xdata[$key]);
// 两个系列数据以上时绘制小矩形及之后文字说明
if($ydataNum & ) {
$x = $lineChartWidth + $
foreach($this-&seriesName as $key =& $val) {
imagefilledrectangle($this-&image,$x,$y,$x+$recWidth,$y+$recHeight,$color[$key%count($this-&color)]);
imagettftext($this-&image,,,$x+$recWidth+,$y+$recHeight-,$fontColor,$fontPath,$this-&seriesName[$key]);
$y += $recHeight + ;
// 绘画标题
$titleStart = ($this-&width - .*strlen($this-&title))/;
imagettftext($this-&image,,,$titleStart,,$fontColor,$fontPath,$this-&title);
// 输出图片
header("Content-Type:image/png");
imagepng ( $this-&image );
* 私有方法,当数组为二元数组时,统计数组的长度
* Array arr 要做统计的数组
private function arrayNum($arr) {
if(is_array($arr)) {
for($i = ; $i & count($arr); $i++){
if(is_array($arr[$i])) {
$num = count($arr);
* 私有方法,计算数组的深度
* Array arr 数组
private function arrayDepth($arr) {
if(is_array($arr)) {
for($i = ; $i & count($arr); $i++){
if(is_array($arr[$i])) {
$num += $this-&arrayDepth($arr[$i]);
* 私有方法,找到一组中的最大值
* Array arr 数字数组
private function arrayMax($arr) {
$depth = $this-&arrayDepth($arr);
if($depth == ) {
rsort($arr);
$max = $arr[];
}elseif($depth & ) {
foreach($arr as $val) {
if(is_array($val)) {
if($this-&arrayMax($val) & $max) {
$max = $this-&arrayMax($val);
if($val & $max){
* 私有方法,求数组的平均值
* Array arr 数字数组
function arrayAver($arr) {
$aver = array();
foreach($arr as $val) {
if(is_array($val)) {
$aver = array_merge($aver,$val);
$aver[] = $
return array_sum($aver)/count($aver);
* 私有方法,求数组中元素长度最大的值
* Array arr 字符串数组,必须是汉字
private function arrayLengthMax($arr) {
$length = ;
foreach($arr as $val) {
$length = strlen($val) & $length ? strlen($val) : $
return $length/;
// 析构函数
function __destruct(){
imagedestroy($this-&image);
测试代码如下:
$xdata = array('测试一','测试二','测试三','测试四','测试五','测试六','测试七','测试八','测试九');
$ydata = array(array(,,,,,,,,),array(,,,,,,,,));
$color = array();
$seriesName = array("七月","八月");
$title = "测试数据";
$Img = new Chart($title,$xdata,$ydata,$seriesName);
$Img-&paintLineChart();
效果图如下:
到此代码结束。
下面给大家介绍php中GD库的一些简单使用
今天了解了一些GD库的简单使用,现在稍微做一下总结!
GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。 在网站上 GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
php并不局限于输出HTML文本。php通过使用GD扩展库还能用来动态输出图像,例如文字按钮、验证码、数据统计图等。哈可以轻松地编辑图像,力图处理缩略图和为图片添加水印等,具有强大的图像处理能力。
首先我们来说下GD库,绘制个简单图形的一些步骤:
1、首先是创建画布,此处我们利用imagecreatetruecolor函数,也可以利用imagecreate,区别在于前者创建了一个真彩图像,后者创建了一个基于调色板的图像
$img=imagecreatetruecolor(100,100),其中有两个参数分别对应,我们创建的图像的宽和高
2、设置一些必要的"染料盒"
其实就是定义一些之后会用到的填充颜色,此处我们统一定义在这个位置,此处我们利用imagecolorallocate函数
$white=imagecolorallocate($img,0xFF,0xFF,0xFF)或者可以使用RGB的颜色命名方式 如$white=imagecolorallocate($img,255,255,255);
$gray = imagecolorallocate($img, 0xC0, 0xC0, 0xC0);
$darkgray = imagecolorallocate($img, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($img, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($img, 0x00, 0x00, 0x50);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
$darkred = imagecolorallocate($img, 0x90, 0x00, 0x00);
$black=imagecolorallocate($img,0x00,0x00,0x00);
此处我们定义多一些所需要的颜色
3、填充区域颜色,可以简单的理解为填充图片的背景颜色,利用imagefill函数
imagefill($img,0,0,$white),此处的0 0表示从坐标x y处开始填充背景色
4、绘制图形,例如绘制饼状图,所需要的是imagefilledarc函数
imagefilledarc()的参数相对来说较多,形如imagefilledarc($img,50,$i,100,50,0,45,$red,IMG_ARC_PIE);
其中分别表示以red颜色字img图像上绘制一个以50,$i为起点,以0 45角度这个范围内绘制弧线
5、期间我们还可以添加一些说明问题,比如水平的添加一个字符串,利用 imagestring($img,1,20,40,"hello,world!",$red),表示在img图片中以20 40为坐标,写上一个红色的hello,world!字样
6、就是讲图像输出
首先要告之浏览器要以何种图片格式输出,例如以png输出,则使用header("Content-type:image/png");
其次 将图片输出到浏览器中,imagepng($img);
最后,销毁图片,即释放该图片存储所占用的内存 imagedestroy(img);,君,已阅读到文档的结尾了呢~~
PHP生成漂亮的统计表图 GD库
19:55注意在使用的过程中:1 如果出现乱码:则在头部加上函数:ob start
;。2 打开Dreamweaver命令应用原格式。 php a
200 120 400 200
BOJI XZJZ HSZH LYBR
色柱宽 jiange 40;
色柱间间隔 zuo 40;
左侧留空 you 40;
右侧留空 shang 40;
上留空 xia 30;
下留空 zuidashujuzhi 1;
初始化纵轴最大数据值if
error id:..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
PHP生成漂亮的统计表图 GD库
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口1183人阅读
PHP技术文章(2)
近期正在忙于网络星空高性能快速建站PHP框架的的开发,在开发框架工具(Utils)的时候,写了一套PHP绘制各种统计图的程序,拿出来和大家分享一下。
目前版本为1.0,以后会持续更新中。
本版本支持的工能:
支持饼状统计图, 柱形统计图,和折线统计图的绘制
支持2D和3D2两种绘图模式
目前使用的图像颜色为随机色。
支持画布大小,标题,注解文字的字体,字号,颜色等的自定义。
支持图像的输出与保存
ChartFactory.class.php //图表生成工厂类
IChart.class.php //统计图绘制接口,所有类型统计图的绘制类需要继承之
PieChart.class.php //饼状图绘制类
BrokenChart.class.php //折线图绘制类
SquareChart.class.php //柱形图绘制类
测试效果图
源码下载地址
http://download.csdn.net/detail/yangjian
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4180次
排名:千里之外
(1)(3)(1)(2)博客访问: 1447534
博文数量: 1112
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
在PHP中,有一些简单的图像函数是可以直接使用的,但大多数要处理的图像,都需要在编译PHP时加上GD库。除了安装GD库之外,在PHP中还可能需要其他的库,这可以根据需要支持哪些图像格式而定。GD库可以在免费下载,不同的GD版本支持的图像格式不完全一样,最新的GD库版本支持GIF、JPEG、PNG、WBMP、XBM等格式的图像文件,此外还支持一些如FreeType、Type 1等字体库。通过GD库中的函数可以完成各种点、线、几何图形、文本及颜色的操作和处理,也可以创建或读取多种格式的图像文件。
在PHP中,通过GD库处理图像的操作,都是先在内存中处理,操作完成以后再以文件流的方式,输出到浏览器或保存在服务器的磁盘中。创建一个图像应该完成如下所示的4个基本步骤。
(1)创建画布:所有的绘图设计都需要在一个背景图片上完成,而画布实际上就是在内存中开辟的一块临时区域,用于存储图像的信息。以后的图像操作都将基于这个背景画布,该画布的管理就类似于我们在画画时使用的画布。
(2)绘制图像:画布创建完成以后,就可以通过这个画布资源,使用各种画像函数设置图像的颜色、填充画布、画点、线段、各种几何图形,以及向图像中添加文本等。
(3)输出图像:完成整个图像的绘制以后,需要将图像以某种格式保存到服务器指定的文件中,或将图像直接输出到浏览器上显示给用户。但在图像输出之前,一定要使用header()函数发送Content-type通知浏览器,这次发送的是图片不是文本。
(4)释放资源:图像被输出以后,画布中的内容也不再有用。出于节约系统资源的考虑,需要及时清除画布占用的所有内存资源。
我们先来了解一个非常简单的创建图像脚本。在下面的脚本文件image.php中,按前面介绍的绘制图像的四个步骤,使用GD库动态输出一个扇形统计图。代码如下所示:
直接通过浏览器请求该脚本,或是将该脚本所在的URL,赋给HTML中IMG标记的src属性,都可以获取动态输出的图像结果,如图16-1所示。
图16-1&使用PHP的GD库动态绘制统计图
使用PHP的GD库处理图像时,必须对画布进行管理。创建画布就是在内存中开辟一块存储区域,以后在PHP中对图像的所有操作都是基于这个图布处理的,图布就是一个图像资源。在PHP中,可以使用imagecreate()和imageCreateTrueColor()两个函数创建指定的画布。这两个函数的作用是一致的,都是建立一个指定大小的画布,它们的原型如下所示:
虽然这两个函数都可以创建一个新的画布,但各自能够容纳颜色的总数是不同的。imageCreate()函数可以创建一个基于普通调色板的图像,通常支持256色。而imageCreateTrueColor()函数可以创建一个真彩色图像,但该函数不能用于GIF文件格式。当画布创建后,返回一个图像标识符,代表了一幅宽度为$x_size和高度为$y_size的空白图像引用句柄。在后续的绘图过程中,都需要使用这个资源类型的句柄。例如,可以通过调用imagex()和imagey()两个函数获取图像的大小。代码如下所示:
另外,画布的引用句柄如果不再使用,一定要将这个资源销毁,释放内存与该图像的存储单元。画布的销毁过程非常简单,调用imagedestroy()函数就可以实现。其语法格式如下所示:
如果该方法调用成功,就会释放与参数$image关联的内存。其中参数$image是由图像创建函数返回的图像标识符。
在使用PHP动态输出美丽图像的同时,也离不开颜色的设置,就像画画时需要使用调色板一样。设置图像中的颜色,需要调用imageColorAllocate()函数完成。如果在图像中需要设置多种颜色,只要多次调用该函数即可。该函数的原型如下所示:
该函数会返回一个标识符,代表了由给定的RGB成分组成的颜色。参数$red、$green和$blue分别是所需要的颜色的红、绿、蓝成分。这些参数是0到255的整数或者十六进制的0x00到0xFF。第一个参数$image是画布图像的句柄,该函数必须调用$image所代表的图像中的颜色。但要注意,如果是使用imagecreate()函数建立的画布,则第一次对imagecolorallocate()函数的调用,会给基于调色板的图像填充背景色。该函数的使用代码如下所示:
使用GD库中提供的函数动态绘制完成图像以后,就需要输出到浏览器或者将图像保存起来。在PHP中,可以将动态绘制完成的画布,直接生成GIF、JPEG、PNG和WBMP四种图像格式。可以通过调用下面四个函数生成这些格式的图像:
以上四个函数的使用类似,前两个参数的使用是相同的。第一个参数$image为必选项,是前面介绍的图像引用句柄。如果不为这些函数提供其他参数,访问时则直接将原图像流输出,并在浏览器中显示动态输出的图像。但一定要在输出之前,使用header()函数发送标头信息,用来通知浏览器使用正确的MIME类型对接收的内容进行解析,让它知道我们发送的是图片而不是文本的HTML。以下代码段通过自动检测GD库支持的图像类型,来写出移植性更好的PHP程序。如下所示:
如果希望将PHP动态绘制的图像保存在本地服务器上,则必须在第二个可选参数中指定一个文件名字符串。这样,不仅不会将图像直接输出到浏览器,也不需要使用header()函数发送标头信息。
如果使用imageJPEG()函数生成JPEG格式的图像,还可以通过第三个可选参数$quality指定JPEG格式图像的品质,该参数可以提供的值是从0(最差品制,但文件最小)到100(最高品质,文件也最大)的整数,默认值为75。也可以为函数imageWBMP()提供第三个可选参数$forground,指定图像的前景颜色,默认颜色值为黑色。
本文节选自《细说PHP(第2版)》
LAMP兄弟连 组编
电子工业出版社出版
阅读(564) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。现在位置:
在PHP中,有一些简单的图像函数是可以直接使用的,但大多数要处理的图像,都需要在编译PHP时加上GD库。除了安装GD库之外,在PHP中还可能需要其他的库,这可以根据需要支持哪些图像格式而定。GD库可以在/gd/免费下载,不同的GD版本支持的图像格式不完全一样,最新的GD库版本支持GIF、JPEG、PNG、WBMP、XBM等格式的图像文件,此外还支持一些如FreeType、Type 1等字体库。通过GD库中的函数可以完成各种点、线、几何图形、文本及颜色的操作和处理,也可以创建或读取多种格式的图像文件。
在PHP中,通过GD库处理图像的操作,都是先在内存中处理,操作完成以后再以文件流的方式,输出到浏览器或保存在服务器的磁盘中。创建一个图像应该完成如下所示的4个基本步骤。
(1)创建画布:所有的绘图设计都需要在一个背景图片上完成,而画布实际上就是在内存中开辟的一块临时区域,用于存储图像的信息。以后的图像操作都将基于这个背景画布,该画布的管理就类似于我们在画画时使用的画布。
(2)绘制图像:画布创建完成以后,就可以通过这个画布资源,使用各种画像函数设置图像的颜色、填充画布、画点、线段、各种几何图形,以及向图像中添加文本等。
(3)输出图像:完成整个图像的绘制以后,需要将图像以某种格式保存到服务器指定的文件中,或将图像直接输出到浏览器上显示给用户。但在图像输出之前,一定要使用header()函数发送Content-type通知浏览器,这次发送的是图片不是文本。
(4)释放资源:图像被输出以后,画布中的内容也不再有用。出于节约系统资源的考虑,需要及时清除画布占用的所有内存资源。
php中用GD绘制折线图,代码如下:
Class Chart{
private $ // 定义图像
private $ // 定义标题
private $ // 定义Y轴数据
private $ // 定义X轴数据
private $seriesN // 定义每个系列数据的名称
private $ // 定义条形图颜色
private $ // 定义图片背景颜色
private $ // 定义图片的宽
private $ // 定义图片的长
* 构造函数
* String title 图片标题
* Array xdata 索引数组,X轴数据
* Array ydata 索引数组,数字数组,Y轴数据
* Array series_name 索引数组,数据系列名称
function __construct($title,$xdata,$ydata,$seriesName) {
$this-&title = $
$this-&xdata = http://www.jb51.net/article/$
$this->ydata = $
$this->seriesName = $seriesN
$this->color = array('#DC', '#B', '#EDB', '#DDDF', '#CBE', '#E', '#FF', '#FFF', '#AFC');
* 公有方法,设置条形图的颜色
* Array color 颜色数组,元素取值为'#DC'这种形式
function setBarColor($color){
$this-&color = $
* 绘制折线图
public function paintLineChart() {
$ydataNum = $this-&arrayNum($this-&ydata); // 取得数据分组的个数
$max = $this-&arrayMax($this-&ydata); // 取得所有呈现数据的最大值
$max = ($max & )? $max : ;
$multi = $max/; // 如果最大数据是大于的则进行缩小处理
$barHeightMulti = .; // 条形高缩放的比例
$lineWidth = ;
$chartLeft = (+strlen($max))*; // 设置图片左边的margin
$lineY = ; // 初始化条形图的Y的坐标
// 设置图片的宽、高
//$this-&width = $lineWidth*count($this-&xdata) + $chartLeft - $lineWidth/.;
$margin = ; // 小矩形描述右边margin
$recWidth = ; // 小矩形的宽
$recHeight = ; // 小矩形的高
$space = ; // 小矩形与条形图的间距
$tmpWidth = ;
// 设置图片的宽、高
$lineChartWidth = $lineWidth*count($this-&xdata) + $chartLeft - $lineWidth/. ;
// 两个系列数据以上的加上小矩形的宽
if($ydataNum & ) {
$tmpWidth = $this-&arrayLengthMax($this-&seriesName)**/ + $space + $recWidth + + $
$this-&width = $lineChartWidth + $tmpW
$this-&height = ;
$this-&image = imagecreatetruecolor($this-&width ,$this-&height); // 准备画布
$this-&bgcolor = imagecolorallocate($this-&image,,,); // 图片的背景颜色
// 设置条形图的颜色
$color = array();
foreach($this-&color as $col) {
$col = substr($col,,strlen($col)-);
$red = hexdec(substr($col,,));
$green = hexdec(substr($col,,));
$blue = hexdec(substr($col,,));
$color[] = imagecolorallocate($this-&image ,$red, $green, $blue);
// 设置线段的颜色、字体的颜色、字体的路径
$lineColor = imagecolorallocate($this-&image ,xcc,xcc,xcc);
$fontColor = imagecolorallocate($this-&image, x,xf,xf);
$fontPath = 'font/simsun.ttc';
imagefill($this-&image,,,$this-&bgcolor); // 绘画背景
// 绘画图的分短线与左右边线
for($i = ; $i & ; $i++ ) {
imageline($this-&image,$chartLeft-,$lineY-$barHeightMulti*$max//$multi*$i,$lineChartWidth,$lineY-$barHeightMulti*$max//$multi*$i,$lineColor);
imagestring($this-&image,,,$lineY-$barHeightMulti*$max//$multi*$i-,floor($max/*$i),$fontColor);
imageline($this-&image,$chartLeft-,,$chartLeft-,$lineY,$lineColor);
imageline($this-&image,$lineChartWidth-,,$lineChartWidth-,$lineY,$lineColor);
$style = array($lineColor,$lineColor,$lineColor,$lineColor,$lineColor,$this-&bgcolor,$this-&bgcolor,$this-&bgcolor,$this-&bgcolor,$this-&bgcolor);
imagesetstyle($this-&image,$style);
// 绘制折线图的分隔线(虚线)
foreach($this-&xdata as $key =& $val) {
$lineX = $chartLeft + + $lineWidth*$
imageline($this-&image,$lineX,,$lineX,$lineY,IMG_COLOR_STYLED);
// 绘画图的折线
foreach($this-&ydata as $key =& $val) {
if($ydataNum == ) {
// 一个系列数据时
if($key == count($this-&ydata) - )
$lineX = $chartLeft + + $lineWidth*$
$lineY = $lineY-$barHeightMulti*($this-&ydata[$key+])/$
if($key == count($this-&ydata) - ) {
imagefilledellipse($this-&image,$lineX+$lineWidth,$lineY,,,$color[]);
imageline($this-&image,$lineX,$lineY-$barHeightMulti*$val/$multi,$lineX+$lineWidth,$lineY,$color[]);
imagefilledellipse($this-&image,$lineX,$lineY-$barHeightMulti*$val/$multi,,,$color[]);
}elseif($ydataNum & ) {
// 多个系列的数据时
foreach($val as $ckey =& $cval) {
if($ckey == count($val) - )
$lineX = $chartLeft + + $lineWidth*$
$lineY = $lineY-$barHeightMulti*($val[$ckey+])/$
if($ckey == count($val) - ) {
imagefilledellipse($this-&image,$lineX+$lineWidth,$lineY,,,$color[$key%count($this-&color)]);
imageline($this-&image,$lineX,$lineY-$barHeightMulti*$cval/$multi,$lineX+$lineWidth,$lineY,$color[$key%count($this-&color)]);
imagefilledellipse($this-&image,$lineX,$lineY-$barHeightMulti*$cval/$multi,,,$color[$key%count($this-&color)]);
// 绘画条形图的x坐标的值
foreach($this-&xdata as $key =& $val) {
$lineX = $chartLeft + $lineWidth*$key + $lineWidth/ - ;
imagettftext($this-&image,,-,$lineX,$lineY+,$fontColor,$fontPath,$this-&xdata[$key]);
// 两个系列数据以上时绘制小矩形及之后文字说明
if($ydataNum & ) {
$x = $lineChartWidth + $
foreach($this-&seriesName as $key =& $val) {
imagefilledrectangle($this-&image,$x,$y,$x+$recWidth,$y+$recHeight,$color[$key%count($this-&color)]);
imagettftext($this-&image,,,$x+$recWidth+,$y+$recHeight-,$fontColor,$fontPath,$this-&seriesName[$key]);
$y += $recHeight + ;
// 绘画标题
$titleStart = ($this-&width - .*strlen($this-&title))/;
imagettftext($this-&image,,,$titleStart,,$fontColor,$fontPath,$this-&title);
// 输出图片
header("Content-Type:image/png");
imagepng ( $this-&image );
* 私有方法,当数组为二元数组时,统计数组的长度
* Array arr 要做统计的数组
private function arrayNum($arr) {
if(is_array($arr)) {
for($i = ; $i & count($arr); $i++){
if(is_array($arr[$i])) {
$num = count($arr);
* 私有方法,计算数组的深度
* Array arr 数组
private function arrayDepth($arr) {
if(is_array($arr)) {
for($i = ; $i & count($arr); $i++){
if(is_array($arr[$i])) {
$num += $this-&arrayDepth($arr[$i]);
* 私有方法,找到一组中的最大值
* Array arr 数字数组
private function arrayMax($arr) {
$depth = $this-&arrayDepth($arr);
if($depth == ) {
rsort($arr);
$max = $arr[];
}elseif($depth & ) {
foreach($arr as $val) {
if(is_array($val)) {
if($this-&arrayMax($val) & $max) {
$max = $this-&arrayMax($val);
if($val & $max){
* 私有方法,求数组的平均值
* Array arr 数字数组
function arrayAver($arr) {
$aver = array();
foreach($arr as $val) {
if(is_array($val)) {
$aver = array_merge($aver,$val);
$aver[] = $
return array_sum($aver)/count($aver);
* 私有方法,求数组中元素长度最大的值
* Array arr 字符串数组,必须是汉字
private function arrayLengthMax($arr) {
$length = ;
foreach($arr as $val) {
$length = strlen($val) & $length ? strlen($val) : $
return $length/;
// 析构函数
function __destruct(){
imagedestroy($this-&image);
测试代码如下:
$xdata = http://www.jb51.net/article/array('测试一','测试二','测试三','测试四','测试五','测试六','测试七','测试八','测试九'); $ydata = http://www.jb51.net/article/array(array(,,,,,,,,),array(,,,,,,,,)); $color = array(); $seriesName = array("七月","八月"); $title = "测试数据"; $Img = new Chart($title,$xdata,$ydata,$seriesName); $Img-&paintLineChart();
效果图如下:
到此代码结束。
下面给大家介绍php中GD库的一些简单使用
今天了解了一些GD库的简单使用,现在稍微做一下总结!
GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。 在网站上 GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
php并不局限于输出HTML文本。php通过使用GD扩展库还能用来动态输出图像,例如文字按钮、验证码、数据统计图等。哈可以轻松地编辑图像,力图处理缩略图和为图片添加水印等,具有强大的图像处理能力。
首先我们来说下GD库,绘制个简单图形的一些步骤:
1、首先是创建画布,此处我们利用imagecreatetruecolor函数,也可以利用imagecreate,区别在于前者创建了一个真彩图像,后者创建了一个基于调色板的图像
$img=imagecreatetruecolor(100,100),其中有两个参数分别对应,我们创建的图像的宽和高
2、设置一些必要的"染料盒"
其实就是定义一些之后会用到的填充颜色,此处我们统一定义在这个位置,此处我们利用imagecolorallocate函数
$white=imagecolorallocate($img,0xFF,0xFF,0xFF)或者可以使用RGB的颜色命名方式 如$white=imagecolorallocate($img,255,255,255);$gray = imagecolorallocate($img, 0xC0, 0xC0, 0xC0);$darkgray = imagecolorallocate($img, 0x90, 0x90, 0x90);$navy = imagecolorallocate($img, 0x00, 0x00, 0x80);$darknavy = imagecolorallocate($img, 0x00, 0x00, 0x50);$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);$darkred = imagecolorallocate($img, 0x90, 0x00, 0x00);$black=imagecolorallocate($img,0x00,0x00,0x00);
此处我们定义多一些所需要的颜色
3、填充区域颜色,可以简单的理解为填充图片的背景颜色,利用imagefill函数
imagefill($img,0,0,$white),此处的0 0表示从坐标x y处开始填充背景色
4、绘制图形,例如绘制饼状图,所需要的是imagefilledarc函数
imagefilledarc()的参数相对来说较多,形如imagefilledarc($img,50,$i,100,50,0,45,$red,IMG_ARC_PIE);
其中分别表示以red颜色字img图像上绘制一个以50,$i为起点,以0 45角度这个范围内绘制弧线
5、期间我们还可以添加一些说明问题,比如水平的添加一个字符串,利用 imagestring($img,1,20,40,"hello,world!",$red),表示在img图片中以20 40为坐标,写上一个红色的hello,world!字样
6、就是讲图像输出
首先要告之浏览器要以何种图片格式输出,例如以png输出,则使用header("Content-type:image/png");
其次 将图片输出到浏览器中,imagepng($img);
最后,销毁图片,即释放该图片存储所占用的内存 imagedestroy(img);,

我要回帖

更多关于 三角形统计图的绘制 的文章

 

随机推荐