找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 354|回复: 0
打印 上一主题 下一主题

php打造智能化的柱状图程序,用于报表等

[复制链接]

2487

主题

2487

帖子

7391

积分

论坛元老

Rank: 8Rank: 8

积分
7391
跳转到指定楼层
楼主
发表于 2018-2-14 05:45:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            php打造智能化的柱状图程序,用于报表等
_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($, $, $barHeights, $barTexts = null, $barColors = null)
{
$this->_W = $;
$this->_H = $;
$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()
{
$$this->_W;
$$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, $, $, $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 = $- $paddingRight;
$y2 = $- $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 = $- $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();
/***/
?>
以上所述就是本文的全部内容了,希望大家能够喜欢。
            
            
您可能感兴趣的文章:
  • php GD绘制24小时柱状图
  • PHP 柱状图实现代码
  • php报表之jpgraph柱状图实例代码
  • JpGraph php柱状图使用介绍
  • 在PHP上显示JFreechart画的统计图方法
  • php+highchats生成动态统计图
  • PHP实现绘制3D扇形统计图及图片缩放实例
  • PHP制作3D扇形统计图以及对图片进行缩放操作实例
  • PHP动态柱状图实现方法
  • PHP实现动态柱状图改进版
  • PHP中使用GD库绘制折线图 折线统计图的绘制方法
  • PHP实现的曲线统计图表示例
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端