Thuật toán vẽ biểu đồ dạng cột trong PHP

Hôm nay TKS giới thiệu thuật toán vẽ biểu đồ cho các bạn
Màu sắc theo default thì nó không đẹp lắm, chúng ra chỉ cần chỉnh lại mã theo mã RGB để cho nó đẹp nhé.
Demo:

Thuật toán:

1275, thuong=>1312, thu=>17 , ghet=>200);
$max = max( $cells );
$total = count ( $cells );
$totalwidth = 556;
$totalheight = 120;
$xgutter = 100; // left/right margin
$ygutter = 20; // top/bottom margin
$internalgap = 10; // space between cells
$bottomspace = 30; // gap at the bottom (in addition to margin)
$font = "elephant.ttf";
$graphCanX = ( $totalwidth - $xgutter*2 );
$graphCanY = ( $totalheight - $ygutter*2 - $bottomspace );// starting draw position x - axis
$posX = $xgutter; // starting draw pos - y -  axis
$posY = $totalheight - $ygutter - $bottomspace;
$cellwidth = (int) (( $graphCanX - ( $internalgap * ( $total-1 ) )) / $total) ;
 $textsize = (int)($bottomspace);
// adjust font size
while ( list( $key, $val ) = each ( $cells ) )
    {
     while ( 1 )
        {
        $box = ImageTTFbBox( $textsize, 0, $font, $key );
        $textWidth = abs( $box[2] );
        if ( $textWidth < $cellwidth )
            break;
        $textsize--;
        }
    }
$image = imagecreate( $totalwidth, $totalheight );
$red = ImageColorAllocate($image, 224, 224, 224);
$blue = ImageColorAllocate($image, 0, 0, 255 );
$black = ImageColorAllocate($image, 0, 0, 0 );
$grey = ImageColorAllocate($image, 100, 100, 100 );
 reset ($cells);
 while ( list( $key, $val ) = each ( $cells ) )
     {
     $cellheight = (int) (($val/$max) * $graphCanY);
     $center = (int)($posX+($cellwidth/2));
    imagefilledrectangle( $image, $posX, ($posY-$cellheight), ($posX+$cellwidth), $posY, $blue );
     $box = ImageTTFbBox( $textsize, 0, $font, $key );
     $tw = $box[2];
     ImageTTFText(    $image, $textsize, 0, ($center-($tw/2)),
             ($totalheight-$ygutter), $black, $font, $key );
     $posX += ( $cellwidth + $internalgap);
     }
 imagegif( $image );
 ?>
Chúc bạn thành công,
TKS
FOLLOW US

Leave a Reply

Your email address will not be published. Required fields are marked *