16
Май
2008
Круговая диаграма на PHP с использованием GD
posted in PHP |Часто данные приходится отображать в наглядном для пользователя виде, а именно с помощью диаграм. Одним из видов диаграм является круговая, где за каждый элемент отвечает свой сектор.
Напишем функцию, которая стоит такую диаграму используя библиотеку GD для PHP. В качестве входных параметров ассоциативный массив $ar ($ar[‘имя’]=данные;) и $title для заголовка диаграмы.
Сначала создадим саму функцию в piegraph.php:
<?
function GraphPie($ar,$title) {
// размеры диаграмы
$diagramWidth=600;
$diagramHeight=370;
$legendOffset=50;
// отсортируем по убыванию, сохраняя ключи
arsort($ar);
// наш скрипт будет объединять в один сектор все элементы, которые по отдельности не превыщают 1%
// Суммируем (можете использовать также функцию array_sum() )
$sum=0;
foreach ($ar as $name => $val) {
$sum+=$val;
}
//узнаем сколько меньше 1%
$sumless1=0; // и их сумму
$countless1=$countgreater1=0;
foreach ($ar as $name => $val) {
if ($val/$sum<0.01)
{ $sumless1+=$val;
$countless1++;
}
else $countgreater1++;
}
// создаем ихображение
$image = imageCreate($diagramWidth, $diagramHeight);
// цвета для фона и текста
$colorBackgr = imageColorAllocate($image, 220,220,220);
$colorText = imageColorAllocate($image, 0, 0, 0);
// цвета для наших секторов
$colors[0] = imagecolorallocate($image, 255, 0, 0);
$colors[1] = imagecolorallocate($image, 0, 151, 0);
$colors[2] = imagecolorallocate($image, 0, 0, 255);
$colors[3] = imagecolorallocate($image, 255, 255, 0);
$colors[4] = imagecolorallocate($image, 0, 255, 255);
$colors[5] = imagecolorallocate($image, 204, 0, 206);
$colors[6] = imagecolorallocate($image, 155, 105, 27);
$colors[7] = imagecolorallocate($image, 134,188,134);
$colors[8] = imagecolorallocate($image, 255,189,62);
$colors[9] = imagecolorallocate($image, 168,168,255);
$colors[10] = imagecolorallocate($image, 219,255,111);
$colors[11] = imagecolorallocate($image, 255,201,200);
$colors[12] = imagecolorallocate($image, 0,169,168);
$colors[13] = imagecolorallocate($image, 248,255,213);
$colors[14] = imagecolorallocate($image, 255,106,105);
$colors[15] = imagecolorallocate($image, 133,133,133);
$colors[16] = imagecolorallocate($image, 194,255,255);
$colors[17] = imagecolorallocate($image, 90,9,255);
$colors[18] = imagecolorallocate($image, 109,255,110);
$colors[19] = imagecolorallocate($image, 255,133,22);
// заполняем изображение цветом фона
imageFilledRectangle($image, 0, 0, $diagramWidth - 1, $diagramHeight - 1, $colorBackgr);
// начальный угол для сектора
$startAngle=0;
$perc=360/$sum; // соотвествие градусов 1 проценту
$i=0; // для вывода порядка элемента в легенде и выбора цвета
foreach ($ar as $name => $val) {
// если текущий элемент больше 1%
if ($val/$sum<0.01) // выходим из цикла
break;
// конечный угол сектора
$endAngle=$startAngle+$val*$perc;
// сколько % у нашего элемента
$percents=round(100*($val/$sum),2);
// цветной квадратик в легенде
imagefilledrectangle($image,285,$legendOffset+$i*15-9,295,$legendOffset+$i*15,$colors[$i]);
// текст легенды
imagettftext ($image, 10, 0, 300, $legendOffset+$i*15, $colorText, "arialcyr.ttf", ($i+1).". ".$name." (".$percents." %)");
// сектор
imagefilledarc($image, $diagramWidth/2-150, $diagramHeight/2, 200, 200, $startAngle, $endAngle, $colors[$i++], IMG_ARC_PIE);
// следующий сектор в качестве начального угла будет использовать конечный угол текущего
$startAngle=$endAngle;
}
// если есть элементы менее 1%
if ($countless1) {
$endAngle=360;
$percents=round(100*($sumless1/$sum),2);
// цветной квадратик в легенде
imagefilledrectangle($image,285,$legendOffset+$i*15-9,295,$legendOffset+$i*15,$colors[$i]);
// текст в легенде
imagettftext ($image, 10, 0, 300, $legendOffset+$i*15, $colorText, "arialcyr.ttf", ($i+1).". "."Other"." (".$percents." %)");
// сектор "Other"
imagefilledarc($image, $diagramWidth/2-150, $diagramHeight/2, 200, 200, $startAngle, $endAngle, $colors[$i++], IMG_ARC_PIE);
}
// Заголовок диаграмы
imagettftext ($image, 14, 0, 10, 20, $colorText, "arialcyr.ttf", $title);
// некая копирайт информация
imagettftext ($image, 10, 0, 10, $diagramHeight-10, $colorText, "arialcyr.ttf", "www.aurorascorpio.com");
// выводим картинку
header("Content-type: image/png");
imagepng($image);
imageInterlace($image, 1);
imageColorTransparent($image, $colorBackgr);
return;
}
?>
Теперь протестируем скрипт. Создадим diagrampietest.php с данными о использовании веб-браузеров:
<?
include("piegraph.php"); // скрипт с функцией GraphPie
// наш массив данных
$gr_val=array("Firefox"=>80,"Opera"=>50,"IE"=>150);
$gr_val["Netscape"]=2;
$gr_val["Konqueror"]=1;
$gr_val["Mozilla"]=3;
$gr_val["Safari"]=20;
// постоение диаграмы
GraphPie($gr_val,"Browsers");
?>
Вы увидите следующую диаграму:
