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

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

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

  1. <?php
  2. include(‘dia.php’);
  3. $instance = new dia();
  4. $data=array(‘3aad00’=>120, ‘f10d0d’=>20, ‘280df1’=>70, ‘dd0ee5’=>45, ‘000000’=>10);
  5. $instance>generate($data);

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

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


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

Код класса:

  1. <?php
  2. class dia
  3. {
  4. /*
  5. * @param array $result
  6. * associative array WebColor=>SomeNumber
  7. * @return picture
  8. */
  9. public function generate($result = array(‘808080’=>33, ‘800080’=>33, ‘000000’=>33))
  10. {
  11. $sum=0;
  12. /*Calculate sum of all elements*/
  13. foreach($result AS $row)
  14. {
  15. $sum += $row;
  16. }
  17. $image = imagecreatetruecolor(500, 500);
  18. imagefilledrectangle($image, 0, 0, 500, 500, imagecolorallocate($image, 255, 255, 255));
  19. $old_grad=0;
  20. foreach($result AS $key => $row)
  21. {
  22. /*split array*/
  23. list($r, $g, $b) = $this>_html2rgb($key);
  24. /*Calculate sectors in degrees*/
  25. $grad = $old_grad + round(($row*360)/$sum);
  26. /*LibGD rounds degrees.*/
  27. if(round($old_grad) == round($grad))
  28. continue;
  29. $color = imagecolorallocate($image, $r, $g, $b);
  30. imagefilledarc($image, 250, 250, 500, 500, $old_grad, $grad, $color, IMG_ARC_PIE);
  31. $old_grad = $grad;
  32. }
  33. header(‘Content-type: image/gif’);
  34. imagegif($image);
  35. imagedestroy($image);
  36. }
  37. /*
  38. * @param $color
  39. * WebColor
  40. *
  41. * @return array
  42. * Color in RGB notation
  43. */
  44. private function _html2rgb($color)
  45. {
  46. if ($color[0] == ‘#’)
  47. $color = substr($color, 1);
  48. if (strlen($color) == 6)
  49. list($r, $g, $b) = str_split($color, 2);
  50. else
  51. return false;
  52. $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
  53. return array($r, $g, $b);
  54. }
  55. }