Блуждая по просторам интернета я наткнулся на пару интересных статей, в них обсуждалась возможность рисования 3D диаграмм средствами php. Меня заинтересовала эта тема и я еще немного поискав, нашел несколько наработок. Собрав все воедино я написал функцию, которая работает на библиотеке GD. Функция получилась не большая, но результат ее работы весьма интересный. Эта функция получает массив чисел и основываясь на них рисуется столбцовая диаграмма.
Код с подробными комментариями и пример использования находится ниже:
/**
* Функция для создания столбцовой диаграммы
* @var array $values - массив значений, для столбцов
* @var integer $width - не обязательный параметр, ширина диаграммы
* @var integer$height - не обязательный параметр, высота диаграммы
*
* @return image $img - возвращает изображение
*/
function drawDiagram($values, $width = 400, $height = 200){
$columns = count($values); // количество столбцов
$columnWidth = floor($width / $columns) ; // расчет ширины колонки
$padding = 5; // отступ между столбцами
$img = imagecreate($width,$height); // создаем холст для диаграммы
$r = 0xaf;
$g = 0xaf;
$b = 0xcc;
$colorFront = imagecolorallocate ($img, $r, $g, $b); // цвет лицевой части столбца
$colorTop = imagecolorallocate ($img, $r+40, $g+40, $b+40); // цвет верхней части столбца
$colorRight = imagecolorallocate ($img, $r-20, $g-20, $b-20); // цввет боковой части столбца
$white = imagecolorallocate ($img, 0xff, 0xff, 0xff); // цвет фона
imagefilledrectangle($img, 0, 0, $width, $height, $white); // создаем заготовку для диаграммы, холст с фоном
$maxv = 0;
$maxHeight = $height - $columnWidth; // максимальная высота столбца
// находим максимальное значение столбца
for($i=0;$i<$columns;$i++){
$maxv = max($values[$i],$maxv);
}
// рисуем столбцы
for($i=0;$i<$columns;$i++){
$columnHeight = ($maxHeight / 100) * (( $values[$i] / $maxv) *100); // высота одного столбца
// расчет координат столбца
$x1 = $i * $columnWidth;
$y1 = $height-$columnHeight;
$x2 = (($i+1)*$columnWidth)-$padding;
$y2 = $height;
imagefilledrectangle($img,$x1,$y1,$x2,$y2,$colorFront); // рисуем столбец - переднюю часть
// расчет координат для верхней части столбца
$offset = ($columnWidth-$padding) / 2;
$pt = array($x1, $y1, $x1+$offset, $y1-$offset, $x2+$offset, $y1-$offset, $x2, $y1);
imagefilledpolygon($img,$pt,4,$colorTop); // рисуем столбец - верхнюю часть
// расчет координат для боковой части столбца
$pt = array($x2, $y1, $x2+$offset, $y1-$offset, $x2+$offset, $y2-$offset, $x2, $y2);
imagefilledpolygon($img,$pt,4,$colorRight); // рисуем столбец - боковую часть
}
return $img; // возвращаем, нарисованную диаграмму
}
// пример использования
header("Content-type: image/png"); // заголовок для браузера - чтоб вывести картинку на экран
$values = array(55, 20, 40, 30, 25, 70, 30, 45, 55, 15, 5); // значения столбцов
$img = drawDiagram($values, 500, 250); // вызываем функцию для создания диаграммы
imagePng($img); // выводим диаграмму на экран
// можно вместо вывода на экран сохранить картинку
//$path = 'C:/diagramma.png';
//imagePng($im, $path);
// В конце освобождаем память, занятую картинкой
imageDestroy($img);
