Home  >  Article  >  Backend Development  >  php作图柱状图

php作图柱状图

WBOY
WBOYOriginal
2016-06-13 12:20:53916browse

php绘制柱状图

效果:


<?php /***  * @project Bar Graph Program  * @license GPL  * @package  * @file GrapBar.php  * @date 2007-4-3  * @version 1.0  * @last modified   * 定义 柱状图(柱形图) 类  *  * 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配置中的open_basedir项,如果没此路径请添加,或在程序中设置包含  *  * 智能化的柱状图程序,用于报表等  *  ***/ define("DEFAULT_FONT_PATH", "c:/windows/fonts/simhei.ttf");class SingleBar{ private $_x; private $_y; private $_h; public $_l = 50; private $_w = null; private $_srcPoints = array(); private $_points = array();  public function __construct($x, $y, $h, $l = 50, $w = null) {  $this->_x = $x;  $this->_y = $y;  $this->_h = $h;  $this->_l = $l;  $this->_w = $w;  $this->_srcPoints = $this->getSrcPoints();  $this->_points = $this->getPoints(); }  public function getSrcPoints() {  return array(   array($this->_x                 , $this->_y),   array($this->_x+$this->_l       , $this->_y),   array($this->_x+(1.35*$this->_l), $this->_y-(0.35*$this->_l)),   array($this->_x+(0.35*$this->_l), $this->_y-(0.35*$this->_l)),   array($this->_x                 , $this->_y+$this->_h),   array($this->_x+$this->_l       , $this->_y+$this->_h),   array($this->_x+(1.35*$this->_l), $this->_y+$this->_h-(0.35*$this->_l))  ); }  public function getPoints() {  $points = array();  foreach($this->_srcPoints as $key => $val)  {   $points[] = $val[0];   $points[] = $val[1];  }  return $points; }  public function getTopPoints() {  return array_slice($this->_points, 0, 8); //顶坐标 }  public function getBelowPoints() {  return array_merge(array_slice($this->_points, 0, 2), array_slice($this->_points, 8, 4), array_slice($this->_points, 2, 2)); //下坐标 }  public function getRightSidePoints() {  return array_merge(array_slice($this->_points, 2, 2), array_slice($this->_points, 10, 4), array_slice($this->_points, 4, 2)); //右侧坐标 }  public function draw($image, $topColor, $belowColor, $sideColor, $borderColor = null, $type = 'LEFT') {  if (is_null($borderColor))  {   $borderColor = 0xcccccc;  }    $top_rgb = $this->getRGB($topColor);  $below_rgb = $this->getRGB($belowColor);  $side_rgb = $this->getRGB($sideColor);  $top_color = imagecolorallocate($image, $top_rgb['R'], $top_rgb['G'], $top_rgb['B']);  $below_color = imagecolorallocate($image, $below_rgb['R'], $below_rgb['G'], $below_rgb['B']);  $side_color = imagecolorallocate($image, $side_rgb['R'], $side_rgb['G'], $side_rgb['B']);    imagefilledpolygon($image, $this->getTopPoints(), 4, $top_color); //画顶面  imagepolygon($image, $this->getTopPoints(), 4, $borderColor); //画顶面边线    imagefilledpolygon($image, $this->getBelowPoints(), 4, $below_color); //画下面  imagepolygon($image, $this->getBelowPoints(), 4, $borderColor); //画下面边线    if ($type == 'LEFT')  {   imagefilledpolygon($image, $this->getRightSidePoints(), 4, $side_color); //画右侧面   imagepolygon($image, $this->getRightSidePoints(), 4, $borderColor); //画侧面边线  }  }  public function getRGB($color) {  $ar = array();  $color = hexdec($color);  $ar['R'] = ($color>>16) & 0xff;  $ar['G'] = ($color>>8) & 0xff;  $ar['B'] = ($color) & 0xff;  return $ar; }}class Bar{ private $_W; private $_H; private $_bgColor = "ffffff"; private $_barHeights = array(); private $_barTexts = array(); private $_barColors = array(); public $_title; public $_paddingTop = 30; public $_paddingBottom = 100; public $_paddingLeft = 45; public $_paddingRight = 2; public $_barL = 50; public $image;  public function __construct($imgW, $imgH, $barHeights, $barTexts = null, $barColors = null) {  $this->_W = $imgW;  $this->_H = $imgH;  $this->_barHeights = $barHeights;  $this->_barTexts   = $barTexts;  $this->_barColors  = $barColors;  $this->_paddingBottom = $this->resetPaddingBottom();  $this->_H = $this->resetHeight();  $this->image = imagecreatetruecolor($this->_W, $this->_H); }  public function stroke() {  $this->drawBg();  $this->drawBars();  $this->drawTitle();  $this->drawLables();  ob_start();  //header("Content-type: image/png");  //imagepng($this->image);  header("Content-type: " . image_type_to_mime_type(IMAGETYPE_JPEG));        imagejpeg($this->image);  imagedestroy($this->image); }  public function drawBg() {  $img_w = $this->_W;  $img_h = $this->_H;  $paddingTop    = $this->_paddingTop;  $paddingBottom = $this->_paddingBottom;  $paddingLeft   = $this->_paddingLeft;  $paddingRight  = $this->_paddingRight;  $rgb = $this->getRGB($this->_bgColor);  $bg = imagecolorallocate($this->image,$rgb['R'], $rgb['G'], $rgb['B']);  imagefilledrectangle($this->image, 0, 0, $img_w, $img_h, $bg);  $side_bg = imagecolorallocatealpha($this->image, 220, 220, 220, 75);  $side_bg2 = imagecolorallocate($this->image, 220, 220, 220);  $border_color = imagecolorallocate($this->image, 190, 190, 190);  $line_color = imagecolorallocate($this->image, 236, 236, 236);  $dial_color = imagecolorallocate($this->image, 131, 131, 131);    $x1 = $paddingLeft;  $y1 = $paddingTop;  $x2 = $img_w - $paddingRight;  $y2 = $img_h - $paddingBottom;  imagerectangle($this->image, $x1, $y1, $x2, $y2, $border_color);  imagefilledpolygon($this->image, array($x1-5,$y1+10, $x1-5,$y2+10,  $x1,$y2,  $x1,$y1), 4, $side_bg);        imagepolygon($this->image, array($x1-5,$y1+10, $x1-5,$y2+10,  $x1,$y2,  $x1,$y1), 4, $border_color);  imagefilledpolygon($this->image, array($x1-5,$y2+10, $x2-5,$y2+10,  $x2,$y2,  $x1,$y2), 4, $side_bg);        imagepolygon($this->image, array($x1-5,$y2+10, $x2-5,$y2+10,  $x2,$y2,  $x1,$y2), 4, $border_color);  imageline($this->image, $x1, $y2, $x2, $y2, $side_bg2);    $total_h = $img_h - $paddingTop - $paddingBottom;  $every_h = $total_h/11;  for($i=1; $iimage, $x1, $y1+($every_h*$i), $x2, $y1+($every_h*$i), $line_color); //画网线  }    $max_h = max($this->_barHeights);  for($i=1; $iimage, $x1-5-3, $y1+10+($every_h*$i), $x1-3+1, $y1+10+($every_h*$i), $dial_color); //画刻度线   imagestring($this->image, 3, $x1-5-3-$str_w-1, $y1+10+($every_h*$i)-5, $value, 0x000000);  } }   public function drawBars() {  $counts = count($this->_barHeights);  if (empty($this->_barColors))  {   $color = $this->setColor();   $this->_barColors = array_slice($color, 0, $counts);   //shuffle($this->_barColors);  }  $every_w = ($this->_W - $this->_paddingLeft - $this->_paddingRight)/$counts; //每一段宽  $barL = $every_w;  $barL = ($barL > $this->_barL*1.35+6) ? $this->_barL : $barL/1.35 - 6;  $max_h = max($this->_barHeights);  $ruler_h = $this->_H - $this->_paddingTop - $this->_paddingBottom; //标尺总高度  $stander_h = $ruler_h - ($ruler_h/11); //标尺10等分的高度  $i = 0;  foreach ($this->_barHeights as $val)  {   $h = ($stander_h/$max_h)*$val;   $x = $this->_paddingLeft + ($every_w*$i) + (($every_w - ($barL*1.35))/2);;   $y = $this->_H - $this->_paddingBottom + 10 - $h;   //$t_color = $this->_barColors[$i];   $b_color = $this->_barColors[$i];   //$s_color = $this->_barColors[$i];      $rgb = $this->getRGB($this->_barColors[$i]);   $R = $rgb['R'] * 0.7;   $G = $rgb['G'] * 0.7;   $B = $rgb['B'] * 0.7;      $c1 = $R > 0 ? dechex($R) : '00';   $c2 = $G > 0 ? dechex($G) : '00';   $c3 = $B > 0 ? dechex($B) : '00';   $t_color = $b_color;   $s_color = $c1. $c2 . $c3;   $SingleBar = new SingleBar($x, $y, $h, $barL);   $SingleBar->draw($this->image, $t_color, $b_color, $s_color);   $i++;  } }  public function drawTitle() {  if (empty($this->_title))  {   return;  }  $font = 5;  $font_w = imagefontwidth($font);  $len = strlen($this->_title);  $x = ($this->_W + $this->_paddingLeft - $this->_paddingRight)/2;  $x -= ($len*$font_w)/2;  $y = ($this->_paddingTop - $font_w)/2 + 12;  //imagestring($this->image, $font, $x, $y, $title, 0x000000);  imagettftext($this->image, 12, 0, $x, $y, 0x000000, DEFAULT_FONT_PATH, $this->_title); }  public function drawLables() {  $x1 = $this->_paddingLeft - 5;  $y1 = $this->_H - $this->_paddingBottom + 20;  $x2 = $this->_W - $this->_paddingRight;  $y2 = $this->_H - 10;  //imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, 0xffffff);  imagerectangle($this->image, $x1, $y1, $x2, $y2, 0x000000);  $space = 5;  $x = $x1 + 3;  $y = $y1 + 3;  foreach ($this->_barTexts as $key => $val)  {   $color = $this->_barColors[$key];   $rgb = $this->getRGB($color);   $bg = imagecolorallocate($this->image,$rgb['R'], $rgb['G'], $rgb['B']);   imagefilledrectangle($this->image, $x, $y, $x+12, $y+12, $bg); //绘12*12的矩形         imagerectangle($this->image, $x, $y, $x+12, $y+12, 0x000000); //绘12*12的矩形框   imagettftext($this->image, 12, 0, $x+12+3, $y+12, 0x000000, DEFAULT_FONT_PATH, $val);   $x += 12 + $space + (strlen($val)*8) + $space;   if ($x + (strlen($val)*8) >= $this->_W - $this->_paddingLeft - $this->_paddingRight)   {    $x = $x1 + 3;    $y = $y + 12 + 3;   }  } }  public function resetPaddingBottom() {  $ruler_w = $this->_W - $this->_paddingLeft - $this->_paddingRight;  $label_w = $this->getLableTotalWidth();  $lines = ceil($label_w / $ruler_w);  $h = 12 * $lines + (3 * ($lines + 1)) + 30;  return $h; }  public function resetHeight() {  $padding_bottom = $this->resetPaddingBottom();  if ($this->_H - $padding_bottom _H; }  public function getLableTotalWidth() {  $counts = count($this->_barTexts);  $space = 5;  $total_len = 0;  foreach ($this->_barTexts as $val)  {   $total_len += strlen($val);  }    $tx_w = ($total_len * 9) + ((12 + 3 + $space) * $counts);  return $tx_w; }  public function setBg($color) {  $this->_bgColor = $color; }  public function setTitle($title) {  $this->_title = $title; }  public function setColor() {  $ar = array('ff', '00', '33', '66', '99', 'cc');  $color = array();  for ($i=0; $i>16) & 0xff;  $ar['G'] = ($color>>8) & 0xff;  $ar['B'] = ($color) & 0xff;  return $ar; }}/***/$bar = new Bar(500, 300, array(600, 300, 30, 500, 400, 250, 350, 360), array('AAAAA', 'BBBBB', 'CCCCC', 'DDDDD', 'EEEEEE', 'FFFFFF', 'GGGGGGG', 'HHHHHHHHH'));$bar->setTitle('打造完美柱状图!');$bar->stroke();/***/?>


1楼u0100288694小时前
楼主总结的很详细,学习了 。nn欢迎关注,互相交流:http://blog.csdn.net/u010028869
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn