16 Май 2008

Круговая диаграма на PHP с использованием GD

posted in PHP |

Часто данные приходится отображать в наглядном для пользователя виде, а именно с помощью диаграм. Одним из видов диаграм является круговая, где за каждый элемент отвечает свой сектор.
Напишем функцию, которая стоит такую диаграму используя библиотеку GD для PHP. В качестве входных параметров ассоциативный массив $ar ($ar['имя']=данные;) и $title для заголовка диаграмы.

Сначала создадим саму функцию в piegraph.php:

PHP:
  1. <?
  2.  
  3. function GraphPie($ar,$title) {
  4. // размеры диаграмы
  5. $diagramWidth=600;
  6. $diagramHeight=370;
  7. $legendOffset=50;
  8.  
  9. // отсортируем по убыванию, сохраняя ключи
  10. arsort($ar);
  11.  
  12. // наш скрипт будет объединять в один сектор все элементы, которые по отдельности не превыщают 1%
  13. // Суммируем (можете использовать также функцию array_sum() )
  14. $sum=0;
  15. foreach ($ar as $name => $val) {
  16.     $sum+=$val;
  17. }
  18.  
  19. //узнаем сколько меньше 1%
  20. $sumless1=0; // и их сумму
  21. $countless1=$countgreater1=0;
  22. foreach ($ar as $name => $val) {
  23.     if ($val/$sum<0.01)
  24.      { $sumless1+=$val;
  25.        $countless1++;
  26.        }
  27.        else $countgreater1++;
  28. }
  29.  
  30.  // создаем ихображение
  31. $image = imageCreate($diagramWidth, $diagramHeight);
  32.  
  33. // цвета для фона и текста
  34. $colorBackgr = imageColorAllocate($image, 220,220,220);
  35. $colorText = imageColorAllocate($image, 0, 0, 0);
  36. // цвета для наших секторов
  37. $colors[0] = imagecolorallocate($image, 255, 0, 0);
  38. $colors[1] = imagecolorallocate($image, 0, 151, 0);
  39. $colors[2] = imagecolorallocate($image, 0, 0, 255);
  40. $colors[3] = imagecolorallocate($image, 255, 255, 0);
  41. $colors[4] = imagecolorallocate($image, 0, 255, 255);
  42. $colors[5] = imagecolorallocate($image, 204, 0, 206);
  43. $colors[6] = imagecolorallocate($image, 155, 105, 27);
  44. $colors[7] = imagecolorallocate($image, 134,188,134);
  45. $colors[8] = imagecolorallocate($image, 255,189,62);
  46. $colors[9] = imagecolorallocate($image, 168,168,255);
  47. $colors[10] = imagecolorallocate($image, 219,255,111);
  48. $colors[11] = imagecolorallocate($image, 255,201,200);
  49. $colors[12] = imagecolorallocate($image, 0,169,168);
  50. $colors[13] = imagecolorallocate($image, 248,255,213);
  51. $colors[14] = imagecolorallocate($image, 255,106,105);
  52. $colors[15] = imagecolorallocate($image, 133,133,133);
  53. $colors[16] = imagecolorallocate($image, 194,255,255);
  54. $colors[17] = imagecolorallocate($image, 90,9,255);
  55. $colors[18] = imagecolorallocate($image, 109,255,110);
  56. $colors[19] = imagecolorallocate($image, 255,133,22);
  57.  
  58. // заполняем изображение цветом фона
  59. imageFilledRectangle($image, 0, 0, $diagramWidth - 1, $diagramHeight - 1, $colorBackgr);
  60.  
  61. // начальный угол для сектора
  62. $startAngle=0;
  63. $perc=360/$sum; // соотвествие градусов 1 проценту
  64. $i=0; // для вывода порядка элемента в легенде и выбора цвета
  65. foreach ($ar as $name => $val) {
  66. // если текущий элемент больше 1%
  67.   if ($val/$sum<0.01) // выходим из цикла
  68.     break;
  69.  
  70. // конечный угол сектора
  71.   $endAngle=$startAngle+$val*$perc;
  72. // сколько % у нашего элемента
  73.   $percents=round(100*($val/$sum),2);
  74.   // цветной квадратик в легенде
  75.   imagefilledrectangle($image,285,$legendOffset+$i*15-9,295,$legendOffset+$i*15,$colors[$i]);
  76.   // текст легенды
  77.   imagettftext ($image, 10, 0, 300, $legendOffset+$i*15, $colorText, "arialcyr.ttf", ($i+1).". ".$name." (".$percents." %)");
  78.   // сектор
  79.   imagefilledarc($image, $diagramWidth/2-150, $diagramHeight/2, 200, 200, $startAngle, $endAngle, $colors[$i++], IMG_ARC_PIE);
  80.   // следующий сектор в качестве начального угла будет использовать конечный угол текущего
  81.   $startAngle=$endAngle;
  82. }
  83.  
  84. // если есть элементы менее 1%
  85. if ($countless1) {
  86.   $endAngle=360;
  87.   $percents=round(100*($sumless1/$sum),2);
  88.   // цветной квадратик в легенде
  89.   imagefilledrectangle($image,285,$legendOffset+$i*15-9,295,$legendOffset+$i*15,$colors[$i]);
  90.   // текст в легенде
  91.   imagettftext ($image, 10, 0, 300, $legendOffset+$i*15, $colorText, "arialcyr.ttf", ($i+1).". "."Other"." (".$percents." %)");
  92.   // сектор "Other"
  93.   imagefilledarc($image, $diagramWidth/2-150, $diagramHeight/2, 200, 200, $startAngle, $endAngle, $colors[$i++], IMG_ARC_PIE);
  94. }
  95.  
  96.  
  97.   // Заголовок диаграмы
  98.  imagettftext ($image, 14, 0, 10, 20, $colorText, "arialcyr.ttf", $title);
  99.   // некая копирайт информация
  100.  imagettftext ($image, 10, 0, 10, $diagramHeight-10, $colorText, "arialcyr.ttf", "www.aurorascorpio.com");
  101.  
  102. // выводим картинку
  103. header("Content-type:  image/png");
  104. imagepng($image);
  105. imageInterlace($image, 1);
  106. imageColorTransparent($image, $colorBackgr);
  107.  
  108. return;
  109. }
  110. ?>

Теперь протестируем скрипт. Создадим diagrampietest.php с данными о использовании веб-браузеров:

PHP:
  1. <?
  2. include("piegraph.php"); // скрипт с функцией GraphPie
  3. // наш массив данных
  4. $gr_val=array("Firefox"=>80,"Opera"=>50,"IE"=>150);
  5. $gr_val["Netscape"]=2;
  6. $gr_val["Konqueror"]=1;
  7. $gr_val["Mozilla"]=3;
  8. $gr_val["Safari"]=20;
  9. // постоение диаграмы
  10. GraphPie($gr_val,"Browsers");
  11. ?>

Вы увидите следующую диаграму:

Browsers - Pie Diagram

Демо

Оставить комментарий

Вам! Клевые квартиры: квартиры в москве аренда на сутки. Распродажа! Интерьер спальни мебель магазин диванов.

268

ортопедический бандаж корсеты костыли напрокат визитки изготовление билеты концерты продажа