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. Мое решение носит больше академический характер, либо для исключительных ситуаций, когда необходимо строить график непременно на стороне сервера.

  • Ev:

    Спасибо, хорошая статья, долго искала несложное решение для построения круговой диаграммы именно средствами PHP.

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