Доброго времени суток! Выкладываю на ваше обозрение/пользование скрипт для вывода диаграммы. PHP: <?php $minW = 500; $minH = 500; $bg = 0xFFFFFF; $innerP = 0; $title = @$_GET['title']; $padding = 5; $barW = @$_GET['bar_w']; $barW = (!empty($barW)) ? (is_numeric($barW) ? $barW : 90) : 90; $spacing = ($barW / 2); $gridAmount = 11; $gridHeight = ($barW); $fs = (int)($barW / 3); $y_axis = @$_GET['y_axis']; $y_axis = $y_axis == 'true' ? true : false; $data = @$_GET['data']; $data = (!empty($data)) ? explode(',', $data) : []; $font = dirname(__FILE__) . '/arial.ttf'; $labels = @$_GET['labels']; $labels = (!empty($labels)) ? explode(',', $labels) : []; $labelsH = array(); $yAxis = array(); $yAxisW = array(); $yAxisRects = array(); $values = array(); $labelsRects = array(); $labelsHMin = 0; $labelsHMax = 0; $yAxisMaxW = 0; $yAxisMinW = 0; $innerH = 0; $outerH = 0; $titleFS = 0; $titlePaddingBottom = 0; if (!empty($data)) { for ($i = 0; $i < count($data); $i++) { if (preg_match('/^\d+$/', $data[$i])) $values[] = (int)$data[$i]; if (preg_match('/^-\d+$/', $data[$i])) $values[] = (int)$data[$i]; if (preg_match('/(\d+)\.(\d+)/', $data[$i])) $values[] = (float)$data[$i]; if (preg_match('/^-\d+.\d+$/', $data[$i])) $values[] = (float)$data[$i]; } } if (!empty($values)) { $min = min($values); $max = max($values); $sum = array_sum($values); $cnt = count($values); $innerW = (int)(($cnt * ($barW)) + ($cnt * $spacing)) + $spacing; $outerW = $innerW; $innerH = (int)($gridAmount * $gridHeight); $outerH = (int)$innerH; for ($i = 0; $i < count($labels); $i++) { $bbox = imagettfbbox($fs, 90, $font, $labels[$i]); $labelsH[] = (int)-$bbox[3]; $labelsRects[] = $bbox; } if ($y_axis) { for ($i = 0; $i < $gridAmount; $i++) { $lbl = sprintf('%.d%%', ($i * (100) / ($gridAmount -1))); $yAxis[] = $lbl; $bbox = imagettfbbox($fs, 0, $font, $lbl); $yAxisW[] = $bbox[2] - $bbox[0]; } } if (!empty($labelsH)) { $labelsHMax = max($labelsH); $labelsHMin = min($labelsH); $outerH = $innerH + ($labelsHMax + ($padding * 2) + $fs); } if (!empty($yAxisW) && $y_axis) { $yAxisMaxW = max($yAxisW); $yAxisMinW = min($yAxisW); $outerW = $innerW + ($yAxisMaxW + ($padding * 4)); } $xOffset = 0; if (!empty($title)) { $titleFS = $outerH / 10; $titlePaddingBottom = (int)($titleFS / 2); $outerH = $outerH + $titleFS + $titlePaddingBottom; $titleBbox = imagettfbbox($titleFS, 0, $font, $title); $titleW = ($titleBbox[2] - $titleBbox[0]); if ($outerW < $titleW) { $outerW = $titleW; $xOffset = ($titleW - $outerW); } } $img = imagecreatetruecolor($outerW, $outerH); imagefill($img, 0, 0, 0xFFFFFF); if (!empty($title)) { $x = (int)(($outerW / 2) - (($titleBbox[2] - $titleBbox[0]) / 2)); $y = (int)$titleFS; imagettftext($img, $titleFS, 0, $x, $y, 0, $font, $title); } for ($i = 0; $i < $gridAmount; $i++) { $x1 = $y_axis ? $yAxisMaxW + ($padding * 4) : 0; $x2 = $y_axis ? (int)($innerW + $yAxisMaxW + ($padding * 4)) : $innerW; $y1 = (int)($i * $gridHeight) + ($titleFS + $titlePaddingBottom); $y2 = (int)$y1 + $gridHeight; $bg = ($i % 2) ? 0xf7f7f7 : 0xf0f0f0; imagefilledrectangle($img, $x1, $y1, $x2, $y2, $bg); } if ($y_axis) { for ($i = 0; $i < $gridAmount; $i++) { $x = (int)(($padding * 2) + (($yAxisMaxW / 2) - $yAxisW[$i] / 2)); $y = (int)((($innerH + ($titleFS + $titlePaddingBottom)) - ($i * ($gridHeight))) - (($gridHeight / 2) - ($fs / 2))); imagettftext($img, $fs, 0, $x, $y, 0, $font, $yAxis[$i]); } } if ($y_axis) { imageline($img, $yAxisMaxW + ($padding * 4), ($titleFS + $titlePaddingBottom), $yAxisMaxW + ($padding * 4), $innerH + ($titleFS + $titlePaddingBottom), 0); imageline($img, $yAxisMaxW + ($padding * 4), $innerH + ($titleFS + $titlePaddingBottom), $innerW + $yAxisMaxW + ($padding * 4), $innerH + ($titleFS + $titlePaddingBottom), 0); } for ($i = 0; $i < count($values); $i++) { $val = $values[$i]; $minH = (int)($barW); $maxH = (int)($innerH - $minH); $barH = (int)(($val - $min) * ($maxH - $minH) / ($max - $min) + $minH); $x1 = $y_axis ? (int)($i * ($barW + $spacing)) + $spacing + $yAxisMaxW + ($padding * 4) : (int)($i * ($barW + $spacing)) + $spacing; $x2 = (int)$x1 + $barW; $y1 = (int)(($innerH + ($titleFS + $titlePaddingBottom)) - $barH); $y2 = (int)($innerH + ($titleFS + $titlePaddingBottom))- $padding; if ($val > 0) { $rectColor = imagecolorallocatealpha($img, 32, 143, 175, 20); $topEllipseColor = 0x72b8cc; $bottomEllipseColor = 0x208faf; } else if ($val < 0) { $rectColor = imagecolorallocatealpha($img, 255, 60, 60, 20); $topEllipseColor = 0xff8686; $bottomEllipseColor = 0xff3c3c; } else if ($val == 0) { $rectColor = imagecolorallocatealpha($img, 207, 189, 0, 20); $topEllipseColor = 0xffea09; $bottomEllipseColor = 0xcfbd00; } imagefilledrectangle($img, $x1, $y1, $x2, (int)($y2 - (($barW / 2) / 2)), $rectColor); imagefilledellipse($img, (int)($x1 + ($barW / 2)), $y1, $barW, (int)($barW / 2), $topEllipseColor); imagefilledellipse($img, (int)($x1 + ($barW / 2)), (int)((($innerH + ($titleFS + $titlePaddingBottom)) - $padding) - ($barW / 2) / 2), $barW, (int)($barW / 2), $bottomEllipseColor); $bbox = imagettfbbox($fs, 0, $font, $val); $textW = (int)$bbox[2] - (int)$bbox[0]; $x = (int)($x1 + (($barW / 2) - ($textW / 2))) -2; $y = (int)(($y1) - (($barW / 2) / 2)) - ($fs / 2); imagettftext($img, $fs, 0, $x, $y, 0xFFFFFF, $font, $val); imagettftext($img, $fs, 0, $x-1, $y-1, $topEllipseColor, $font, $val); $labelText = (isset($labels[$i]) ? $labels[$i] : ''); $labelH = (isset($labelsH[$i]) ? $labelsH[$i] : 0); $labelX = (int)($x2 - $fs); $labelY = (int)((($innerH + ($titleFS + $titlePaddingBottom)) + $labelsHMax) - (($labelsHMax / 2) - ($labelH / 2)) + ($fs / 2)); imagettftext($img, $fs, 90, $labelX, $labelY, 0, $font, $labelText); } } header('Content-Type: image/png'); imagepng($img); imagedestroy($img); ?> Пример использования Код (Text): http://site/dia.php?data=11,9,18,-5,0,-4,3,8,1,3,8,1&labels=January,February,March,April,May,June,July,August,September,October,November,December&y_axis=true&title=Test%20diagram&bar_w=60 Описание параметров data - Данные через запятую labels - Метки через запятую y_axis - Показать/Скрыть метки по вертикали title - Заголовок bar_w - Ширина столбца Так-же для работы скрипта нужен файл шрифта, который будет лежать в папке рядом со скриптом. В моей случае это arial.ttf Ширина и высота получившегося в итоге изображения зависит от количества данных в диаграмме, ширины столбца и длины меток. Все настраивается само PS. Если вы решите как-то это доработать/улучшить - большая просьба выложить сюда, спасибо Пример работы скрипта
Если оно вам нужно - то конечно гуд.. молодец но чтоб пользоваться... увольте.... 100500 бибилотек на js которые строят диаграммы, графики и прочие вещи прямо на лету, очень гибко настраиваются итд посмотрите тот-же chartJS
Согласен с ADSoft. В настоящее время графики на PHP уже не строят, так как они имеют значительный минус - они не интерактивны. А на JS легко можно сделать живую диаграмму. Но потрудился, уже молодец.
@Redfern89 сделай интерфейс, чтобы данные можно было настраивать в пользовательском режиме, а запрос к скрипту делался без перезагрузки.