|
|
|
| здравствуйте, подскажите как сделать график продаж по датам?
ниже таблица (не полностью). выводить только те записи в которых `con`=1
как такое можно реализовать?
CREATE TABLE `buy` (
`id` INT NOT NULL AUTO_INCREMENT ,
`date` DATE NOT NULL ,
`con` INT NOT NULL ,
PRIMARY KEY ( `id` )
);
|
| |
|
|
|
|
|
|
|
для: margarita
(07.05.2010 в 10:45)
| | График - множество точек, у которых абcциссы являются допустимыми значениями аргумента x, а ординаты — соответствующими значениями функции y.
Проблема в том, что вы не знаете как это нарисовать, или у вас проблемы с получением данных из таблицы? | |
|
|
|
|
|
|
|
для: sim5
(07.05.2010 в 10:50)
| | проблем с получением нет) а вот как это нарисовать вот это проблема, вы правы)) | |
|
|
|
|
|
|
|
для: margarita
(07.05.2010 в 10:52)
| | Ну в школе то вы изучали графики функций, а значит проблем с пониманием того, как вывести ваши данные в виде графика быть не должно? Если о продажах, значит по Y некая величина продаж того или иного товара, а по Х дата (год, декада, месяц, квартал и т.п.). Это то понятно? Ну а далее отмечаем точки на графике, соеденяем их линией, получаем кривую и т.п.. А вот чем нарисовать... Я не вижу проблем нарисовать его используя GD, но может вам подойдет какая либо из готовых библиотек советуемых в этой теме, может это вам будет понятней. | |
|
|
|
|
|
|
|
для: sim5
(07.05.2010 в 11:16)
| | а примерчик можно на GD? (= | |
|
|
|
|
|
|
|
для: margarita
(07.05.2010 в 12:49)
| | Готовые скрипты разной сложности можно в сети посмотреть, например, вот объемный график:
<?
// Входные данные - три ряда, содержащие случайные данные.
// деление на 2 и 3 для того чтобы передние ряды не загораживали задние.
// массив $DATA["x"] содержит подписи по оси "X"
$DATA = array();
for ($i=0; $i<20; $i++) {
$DATA[0][] = rand(0,100*$i);
$DATA[1][] = rand(0,100*$i)/2;
$DATA[2][] = rand(0,100*$i)/3;
$DATA["x"][] = $i;
}
// Функция вывода псевдо трехмерного куба
// $im - идентификатор изображения
// $x,$y - координаты верхнего левого угла куба
// $w - ширина куба
// $h - высота куба
// $dx - смещение задней грани куба по оси X
// $dy - смещение задней грани куба по оси Y
// $c1,$c2,c3 - цвета видимых граней куба
function imagebar($im,$x,$y,$w,$h,$dx,$dy,$c1,$c2,$c3) {
if ($dx>0) {
imagefilledpolygon($im, array($x, $y-$h,
$x+$w, $y-$h,
$x+$w+$dx, $y-$h-$dy,
$x+$dx, $y-$dy-$h), 4, $c1);
imagefilledpolygon($im, array($x+$w, $y-$h,
$x+$w, $y,
$x+$w+$dx, $y-$dy,
$x+$w+$dx, $y-$dy-$h), 4, $c3);
}
imagefilledrectangle($im, $x, $y-$h, $x+$w, $y, $c2);
}
// Задаем изменяемые значения
// размер изображения
$W = 500;
$H = 300;
// глубина графика
$DX = 30;
$DY = 20;
// отступы
$MB = 20; // нижний
$ML = 10; // левый
$M = 5; // верхний и правый отступы
//ширина одного символа
$LW = imagefontwidth(2);
// подсчитаем количество элементов (столбиков) на графике
$count = count($DATA[0]);
if (count($DATA[1]) > $count) $count = count($DATA[1]);
if (count($DATA[2]) > $count) $count = count($DATA[2]);
// подсчитаем максимальное значение
$max = 0;
for ($i=0; $i<$count;$i++) {
$max = $max < $DATA[0][$i] ? $DATA[0][$i] : $max;
$max = $max < $DATA[1][$i] ? $DATA[1][$i] : $max;
$max = $max < $DATA[2][$i] ? $DATA[2][$i] : $max;
}
// увеличим максимальное значение на 10% (для того, чтобы столбик
// соответствующий максимальному значение не упирался в границу графика
$max = intval($max+($max/10));
// Работа с изображением
// создадим изображения
$im = imagecreate($W,$H);
// задаем основные цвета
// цвет фона (белый)
$bg[0] = imagecolorallocate($im,255,255,255);
// цвет задней грани графика (светло-серый)
$bg[1] = imagecolorallocate($im,231,231,231);
// цвет левой грани графика (серый)
$bg[2] = imagecolorallocate($im,212,212,212);
// цвет сетки (серый, темнее)
$c = imagecolorallocate($im,184,184,184);
// цвет текста (темно-серый)
$text = imagecolorallocate($im,136,136,136);
// цвета для столбиков
$bar[2][0] = imagecolorallocate($im,255,128,234);
$bar[2][1] = imagecolorallocate($im,222,95,201);
$bar[2][2] = imagecolorallocate($im,191,65,170);
$bar[0][0] = imagecolorallocate($im,222,214,0);
$bar[0][1] = imagecolorallocate($im,181,187,65);
$bar[0][2] = imagecolorallocate($im,161,155,0);
$bar[1][0] = imagecolorallocate($im,128,234,255);
$bar[1][1] = imagecolorallocate($im,95,201,222);
$bar[1][2] = imagecolorallocate($im,65,170,191);
// количество подписей и горизонтальных линий сетки по оси Y.
$county = 10;
// подравняем левую границу с учетом ширины подписей по оси Y
$text_width = strlen($max)*$LW;
$ML += $text_width;
// Вывод фона графика
imageline($im, $ML, $M+$DY, $ML, $H-$MB, $c);
imageline($im, $ML, $M+$DY, $ML+$DX, $M, $c);
imageline($im, $ML, $H-$MB, $ML+$DX, $H-$MB-$DY, $c);
imageline($im, $ML, $H-$MB, $W-$M-$DX, $H-$MB, $c);
imageline($im, $W-$M-$DX, $H-$MB, $W-$M, $H-$MB-$DY, $c);
imagefilledrectangle($im, $ML+$DX, $M, $W-$M, $H-$MB-$DY, $bg[1]);
imagerectangle($im, $ML+$DX, $M, $W-$M, $H-$MB-$DY, $c);
imagefill($im, $ML+1, $H/2, $bg[2]);
// Вывод неизменяемой сетки (горизонтальные линии на
// нижней грани и вертикальные линии сетки на левой грани
for ($i=1; $i<3; $i++) {
imageline($im, $ML+$i*intval($DX/3),
$M+$DY-$i*intval($DY/3),
$ML+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$c);
imageline($im, $ML+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$W-$M-$DX+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$c);
}
// пересчитаем размеры графика с учетом подписей и отступов
$RW = $W-$ML-$M-$DX;
$RH = $H-$MB-$M-$DY;
// координаты нулевой точки графика
$X0 = $ML+$DX;
$Y0 = $H-$MB-$DY;
// вывод изменяемой сетки (вертикальные линии сетки на нижней грани графика
// и вертикальные линии на задней грани графика)
for ($i=0;$i<$count;$i++) {
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count)-$DX,$Y0+$DY,$c);
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0-$RH,$c);
}
// горизонтальные линии сетки задней и левой граней.
$step = $RH/$county;
for ($i=0; $i<=$county; $i++) {
imageline($im,$X0,$Y0-$step*$i,$X0+$RW,$Y0-$step*$i,$c);
imageline($im,$X0,$Y0-$step*$i,$X0-$DX,$Y0-$step*$i+$DY,$c);
imageline($im,$X0-$DX,$Y0-$step*$i+$DY, $X0-$DX-($ML-$text_width)/4,$Y0-$step*$i+$DY,$text);
}
// вывод кубов для всех трех рядов
for ($i=0; $i<$count; $i++)
imagebar($im, $X0+$i*($RW/$count)+4-1*intval($DX/3),
$Y0+1*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[0][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[0][0], $bar[0][1], $bar[0][2]);
for ($i=0; $i<$count; $i++)
imagebar($im, $X0+$i*($RW/$count)+4-2*intval($DX/3),
$Y0+2*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[1][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[1][0], $bar[1][1], $bar[1][2]);
for ($i=0; $i<$count; $i++)
imagebar($im, $X0+$i*($RW/$count)+4-3*intval($DX/3),
$Y0+3*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[2][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[2][0], $bar[2][1], $bar[2][2]);
// вывод подписей по оси Y
for ($i=1; $i<=$county; $i++) {
$str=intval(($max/$county)*$i);
imagestring($im,2, $X0-$DX-strlen($str)*$LW-$ML/4-2,
$Y0+$DY-$step*$i-imagefontheight(2)/2,
$str,$text);
}
// вывод подписей по оси X
$prev = 100000;
$twidth = $LW*strlen($DATA["x"][0])+6;
$i = $X0+$RW-$DX;
while ($i>$X0-$DX) {
if ($prev-$twidth>$i) {
$drawx=$i+1-($RW/$count)/2;
if ($drawx>$X0-$DX) {
$str=$DATA["x"][round(($i-$X0+$DX)/($RW/$count))-1];
imageline($im,$drawx,$Y0+$DY,$i+1-($RW/$count)/2,$Y0+$DY+5,$text);
imagestring($im,2, $drawx+1-(strlen($str)*$LW)/2 ,$Y0+$DY+7,$str,$text);
}
$prev=$i;
}
$i-=$RW/$count;
}
// Генерация изображения
header("Content-Type: image/png");
imagepng($im);
imagedestroy($im);
?>
|
Тип (вид) графика будут опрделять ваши данные - их количество, размер переодичности на графике и т.п., поэтому возможно вам нужен будет график гораздо проще, чем этот, не такой "страшный". ) | |
|
|
|
|
|
|
|
для: sim5
(07.05.2010 в 13:19)
| | и правда страшный))) спасибо, ну за пару месяцев я разберусь))) | |
|
|
|
|
|
|
|
для: margarita
(07.05.2010 в 13:40)
| | Изучайте функции GD. Для построения графика нужны элементарные - рисование линий, закрашенных прямоугольников, вывод текста и т.п., на созданном рисунке. Ну а уже сам график - это вспоминайте школу. ;-) | |
|
|
|
|