PHP. Рисуем круговые диаграммы.
PHP

Частенько нужно построить диаграмму для оценки тех или иных количественных параметров. В этом нам поможет библиотека GD и ее PHP API. Нижеследующий класс строит простенькую круговую диаграмму.

Пример использования:

<?php
include('dia.php');
$instance = new dia();
$data=array('3aad00'=>120, 'f10d0d'=>20, '280df1'=>70, 'dd0ee5'=>45, '000000'=>10);
$instance->generate($data);

Как видно из примера, передаем методу generate ассоциативный массив, где ключ — цвет. Минимальный угол — 1 градус, так что если какое-то значение, переведенное в градусы, меньше 1, оно игнорируется. Можно передавать как в процентах, так и в произвольных единицах. Построение происходит с применением пропорций, где сумма всех элементов = 360 градусов.

Из примера получается круговая диаграмма:


test

По клику видим оригинальное изображение 500х500px. Обращаем внимание, что оно угловатое. Поэтому, либо уменьшаем его непосредственно в браузере (параметрами width и height тэга img), либо ресайзим, например, как описано в этой статье с применением метода resample. Целесообразнее воспользоваться первым вариантом, дабы сэкономить ресурсы сервера.

Код класса:

<?php

class dia
{
    /*
     * @param array $result
     * associative array WebColor=>SomeNumber
     * @return picture
    */
    public function generate($result = array('808080'=>33, '800080'=>33, '000000'=>33))
    {
        $sum=0;
       
        /*Calculate sum of all elements*/
        foreach($result AS $row)
        {
            $sum += $row;
        }
        
        $image = imagecreatetruecolor(500, 500);
        imagefilledrectangle($image, 0, 0, 500, 500, imagecolorallocate($image, 255, 255, 255));
        
        $old_grad=0;

        foreach($result AS $key => $row)
        {
            /*split array*/
            list($r, $g, $b) = $this->_html2rgb($key);
            
            /*Calculate sectors in degrees*/
            $grad = $old_grad + round(($row*360)/$sum);
            
            /*LibGD rounds degrees.*/
            if(round($old_grad) == round($grad))
                continue;

            $color = imagecolorallocate($image, $r, $g, $b);
            imagefilledarc($image, 250, 250, 500, 500, $old_grad, $grad, $color, IMG_ARC_PIE);
            $old_grad = $grad;
        }
        
        header('Content-type: image/gif');
        imagegif($image);
        imagedestroy($image);
    }
    
    /*
     * @param $color
     *   WebColor
     * 
     * @return array
     *   Color in RGB notation
     */
    private function _html2rgb($color)
    {
        if ($color[0] == '#')
            $color = substr($color, 1);

        if (strlen($color) == 6)
            list($r, $g, $b) = str_split($color, 2);
        else
            return false;
        
        $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);

        return array($r, $g, $b);
    }
}

  • Александр:

    Полезная диаграмма … Однако работает только в отдельном файле пхп.
    А хотелось картинку вставить как то так: <img src="» width=»400px»>
    в скрипт html + php. Как правильно надо поступить?

    • root4root aka admin:

      Ну, например, можно сделать так: <img src="/diagram.php">, в котором include(‘dia.php’) ну и так далее, как в примере использования. Или можно сохранить картинку на диск, для этого указываем путь сохранения вторым параметром imagegif($image, ‘путь_к_картинке.gif’) в методе generate класса dia. Потом просто в тэге указать к сохраненной картинке путь. Зависит от логики которую вы хотите реализовать, а точнее, от архитектуры скрипта (проекта). Есть, кстати, интересная JS библиотека, называется google charts. Мое решение носит больше академический характер, либо для исключительных ситуаций, когда необходимо строить график непременно на стороне сервера.

Добавить комментарий