Heim  >  Artikel  >  Backend-Entwicklung  >  php绘制柱状图_PHP教程

php绘制柱状图_PHP教程

WBOY
WBOYOriginal
2016-07-13 09:51:471139Durchsuche

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 = &#39;LEFT&#39;)
 {
  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[&#39;R&#39;], $top_rgb[&#39;G&#39;], $top_rgb[&#39;B&#39;]);
  $below_color = imagecolorallocate($image, $below_rgb[&#39;R&#39;], $below_rgb[&#39;G&#39;], $below_rgb[&#39;B&#39;]);
  $side_color = imagecolorallocate($image, $side_rgb[&#39;R&#39;], $side_rgb[&#39;G&#39;], $side_rgb[&#39;B&#39;]);
  
  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 == &#39;LEFT&#39;)
  {
   imagefilledpolygon($image, $this->getRightSidePoints(), 4, $side_color); //画右侧面
   imagepolygon($image, $this->getRightSidePoints(), 4, $borderColor); //画侧面边线
  } 
 }
 
 public function getRGB($color)
 {
  $ar = array();
  $color = hexdec($color);
  $ar[&#39;R&#39;] = ($color>>16) & 0xff;
  $ar[&#39;G&#39;] = ($color>>8) & 0xff;
  $ar[&#39;B&#39;] = ($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[&#39;R&#39;], $rgb[&#39;G&#39;], $rgb[&#39;B&#39;]);
  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; $i<=10; $i++)
  {
   imageline($this->image, $x1, $y1+($every_h*$i), $x2, $y1+($every_h*$i), $line_color); //画网线
  }
  
  $max_h = max($this->_barHeights);
  for($i=1; $i<=10; $i++)
  {
   $value = $max_h - (($max_h/10)*($i-1));
   $value = strval($value);
   $str_w = strlen($value)*5;
   imageline($this->image, $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[&#39;R&#39;] * 0.7;
   $G = $rgb[&#39;G&#39;] * 0.7;
   $B = $rgb[&#39;B&#39;] * 0.7;
   
   $c1 = $R > 0 ? dechex($R) : &#39;00&#39;;
   $c2 = $G > 0 ? dechex($G) : &#39;00&#39;;
   $c3 = $B > 0 ? dechex($B) : &#39;00&#39;;

   $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[&#39;R&#39;], $rgb[&#39;G&#39;], $rgb[&#39;B&#39;]);
   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 < 222)
  {
   return 222 + $padding_bottom;
  }
  return $this->_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(&#39;ff&#39;, &#39;00&#39;, &#39;33&#39;, &#39;66&#39;, &#39;99&#39;, &#39;cc&#39;);
  $color = array();
  for ($i=0; $i<6; $i++)
  {
   for ($j=0; $j<6; $j++)
   {
    for($k=0; $k<6; $k++)
    {
     $color[] = $ar[$i] . $ar[$j] . $ar[$k];
    }
   }
  }
  
  $color2 = array();
  for ($i=1; $i<216; $i += 4)
  {
   $color2[] = $color[$i];
  }

  return $color2;
 }
 
 public function getRGB($color)
 {
  $ar = array();
  $color = hexdec($color);
  $ar[&#39;R&#39;] = ($color>>16) & 0xff;
  $ar[&#39;G&#39;] = ($color>>8) & 0xff;
  $ar[&#39;B&#39;] = ($color) & 0xff;
  return $ar;
 }
}

/***/
$bar = new Bar(500, 300, array(600, 300, 30, 500, 400, 250, 350, 360), array(&#39;AAAAA&#39;, &#39;BBBBB&#39;, &#39;CCCCC&#39;, &#39;DDDDD&#39;, &#39;EEEEEE&#39;, &#39;FFFFFF&#39;, &#39;GGGGGGG&#39;, &#39;HHHHHHHHH&#39;));
$bar->setTitle(&#39;打造完美柱状图!&#39;);
$bar->stroke();
/***/
?>


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1011355.htmlTechArticlephp绘制柱状图 效果: _x = $x; $this->_y = $y; $this->_h = $h; $this->_l = $l; $this->_w = $w; $this->_srcPoints = $this->getSrcPoints(); $this->_points = $this->getPoints()...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn