تالار گفتمان nCIS.ir

نسخه‌ی کامل: نمودار دایره ای در PHP
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
امروز یکی از دوستان نیاز داشتن که نمودار دایره ای با PHP بکشن. این شد که تصمیم گرفتم یه کلاس برای این کار بنویسم. کد کلاس:
<?php
class PIE
{
    private $im;
    private $width;
    private $height;
    private $bg;
    private $colors;
    private $values;
    private $angles;

    public function __construct($width = 300, $height = 300)
    {
        $this->im = ImageCreateTrueColor($width, $height);
        $this->width = $width;
        $this->height = $height;
        $this->bg = ImageColorAllocate($this->im, 255, 255, 255);
        $this->colors = [];
        $this->values = [];
        $this->angles = [];
    }

    public function setBackgroundColor($red, $green, $blue)
    {
        $this->bg = ImageColorAllocate($this->im, $red, $green, $blue);
    }

    public function add($value, $color = null)
    {
        $this->values[] = floatval($value);
        $this->colors[] = is_null($color) ? $this->generateRandomColor() : ImageColorAllocate($this->im, $color[0], $color[1], $color[2]);
    }

    public function render()
    {
        $this->draw();
        ob_start();
        ImagePNG($this->im);
        $imageData = ob_get_clean();
        return 'data:image/png;base64,' . base64_encode($imageData);
    }

    public function saveAs($fileName)
    {
        $this->draw();
        ImagePNG($this->im, $fileName . '.png');
    }

    public function __destruct()
    {
        ImageDestroy($this->im);
    }

    private function draw()
    {
        $this->fillBackground();
        $this->calculateStartEndAngles();
        foreach($this->values as $key => $value) {
            $this->drawArc($value, $this->colors[$key], $this->angles[$key]['start'], $this->angles[$key]['end']);
        }
    }

    private function fillBackground()
    {
        ImageFilledRectangle($this->im, 0, 0, $this->width, $this->height, $this->bg);
    }

    private function generateRandomColor()
    {
        return ImageColorAllocate($this->im, rand(0, 255), rand(0, 255), rand(0, 255));
    }

    private function drawArc($value, $color, $start, $end)
    {
       $w = $this->width / 2;
       $h = $this->height / 2;
        ImageFilledArc($this->im, $w, $h, $w, $h, $start, $end, $color, IMG_ARC_PIE);
    }

    private function calculateStartEndAngles()
    {
        $this->angles = [];
        $total = array_sum($this->values);
        $start = 0;
        foreach($this->values as $value) {
            $angle = ($value / $total) * 360;
            $this->angles[] = ['start' => $start, 'end' => $start + $angle];
            $start += $angle;
        }
    }
}

این هم مثالی از نحوه استفاده از کلاس فوق:
<?php
require_once 'PIE.php';
$pie = new PIE(500, 500);
$pie->add(30, [255, 0, 0]);
$pie->add(40, [0, 255, 0]);
$pie->add(100, [0, 0, 255]);
$pie->add(200);
?>
<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>PIE Chart with PHP</title>
    </head>
    <body>
        <img src="<?= $pie->render() ?>" />
    </body>
</html>

تصویر خروجی رو ضمیمه کردم.

[attachment=367]

از مزایای این کلاس، امکان تعیین رنگ دلخواه برای هر بخش از نمودار و یا اجازه دادن به کلاس برای تولید رنگ تصادفی هست. همچنین محدودیتی در تعداد قطاعهای نمودار (تعداد مقادیر) وجود نداره. همچنین رنگ پس زمینه و ارتفاع و پهنای نمودار رو هم میتونید مشخص کنید. یکی دیگه از مزایای این کلاس اینه که میتونید خروجی رو هم توی فایل ذخیره کنید (متد saveAs) و هم مستقیماً نمایش بدین (متد render).

اگه درمورد نحوه کار و کدنویسی کلاس سؤالی بود در خدمتم.
تشکر از استاد عزیز که همیشه در صحنه هستن.
عالی بود
ممنون