Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: вывод графика
 
 автор: margarita   (07.05.2010 в 10:45)   письмо автору
 
 

здравствуйте, подскажите как сделать график продаж по датам?
ниже таблица (не полностью). выводить только те записи в которых `con`=1
как такое можно реализовать?

CREATE TABLE `buy` (
`id` INT NOT NULL AUTO_INCREMENT ,
`date` DATE NOT NULL ,
`con` INT NOT NULL ,
PRIMARY KEY ( `id` ) 
);

  Ответить  
 
 автор: sim5   (07.05.2010 в 10:50)   письмо автору
 
   для: margarita   (07.05.2010 в 10:45)
 

График - множество точек, у которых абcциссы являются допустимыми значениями аргумента x, а ординаты — соответствующими значениями функции y.
Проблема в том, что вы не знаете как это нарисовать, или у вас проблемы с получением данных из таблицы?

  Ответить  
 
 автор: margarita   (07.05.2010 в 10:52)   письмо автору
 
   для: sim5   (07.05.2010 в 10:50)
 

проблем с получением нет) а вот как это нарисовать вот это проблема, вы правы))

  Ответить  
 
 автор: sim5   (07.05.2010 в 11:16)   письмо автору
 
   для: margarita   (07.05.2010 в 10:52)
 

Ну в школе то вы изучали графики функций, а значит проблем с пониманием того, как вывести ваши данные в виде графика быть не должно? Если о продажах, значит по Y некая величина продаж того или иного товара, а по Х дата (год, декада, месяц, квартал и т.п.). Это то понятно? Ну а далее отмечаем точки на графике, соеденяем их линией, получаем кривую и т.п.. А вот чем нарисовать... Я не вижу проблем нарисовать его используя GD, но может вам подойдет какая либо из готовых библиотек советуемых в этой теме, может это вам будет понятней.

  Ответить  
 
 автор: margarita   (07.05.2010 в 12:49)   письмо автору
 
   для: sim5   (07.05.2010 в 11:16)
 

а примерчик можно на GD? (=

  Ответить  
 
 автор: sim5   (07.05.2010 в 13:19)   письмо автору
 
   для: 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)/,$Y0+$DY+7,$str,$text);
    }
    
$prev=$i;
  }
  
$i-=$RW/$count;
}
// Генерация изображения
header("Content-Type: image/png");
imagepng($im);
imagedestroy($im);
?>

Тип (вид) графика будут опрделять ваши данные - их количество, размер переодичности на графике и т.п., поэтому возможно вам нужен будет график гораздо проще, чем этот, не такой "страшный". )

  Ответить  
 
 автор: margarita   (07.05.2010 в 13:40)   письмо автору
 
   для: sim5   (07.05.2010 в 13:19)
 

и правда страшный))) спасибо, ну за пару месяцев я разберусь)))

  Ответить  
 
 автор: sim5   (07.05.2010 в 13:48)   письмо автору
 
   для: margarita   (07.05.2010 в 13:40)
 

Изучайте функции GD. Для построения графика нужны элементарные - рисование линий, закрашенных прямоугольников, вывод текста и т.п., на созданном рисунке. Ну а уже сам график - это вспоминайте школу. ;-)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования