график php gd,

Ответить
mkden
Сообщения: 96
Зарегистрирован: 08.05.2010
Имеется следующий скрипт:

Код: Выделить всё

  define('GRAPH_WIDTH',         400);               // ширина картинки 
  define('GRAPH_HEIGHT',        300);               // высота картинки 
  define('GRAPH_OFFSET_TOP',    40);                // отступ сверху 
  define('GRAPH_OFFSET_LEFT',   40);                // отступ слева 
  define('GRAPH_OFFSET_RIGHT',  5);                 // отстут справа 
  define('GRAPH_OFFSET_BOTTOM', 30);

  
  
  define('FONT_NAME', '/_font/sansation_regular.ttf');                 // Имя шрифта
  define('FONT_SIZE', 6);                          // Размер шрифта

$colors = array(0xFFA500); 

  
  
$rs = mysql_query ("SELECT * FROM table WHERE id='58' AND date>".strtotime('-1 month')." ORDER BY date ASC");


while ($data2=mysql_fetch_array($rs)) 
{ 


$Data[$data2['date']] = $data2['chislo'];


}

		 
  // Считаем ширину столбцов 
  $col_width = (GRAPH_WIDTH - GRAPH_OFFSET_LEFT - GRAPH_OFFSET_RIGHT) / count($Data); 

  // Считаем высоту столбца, соответствующего максимальному значению 
  $col_maxheight = (GRAPH_HEIGHT - GRAPH_OFFSET_TOP - GRAPH_OFFSET_BOTTOM); 

  // Ищем максимальное значение в массиве, соответствующее столбцу максимальной высоты 
  $max_value = max($Data); 

  $image = imagecreatetruecolor(GRAPH_WIDTH,GRAPH_HEIGHT) // создаем изображение... 
    or die('Cannot create image');     // ...или прерываем работу скрипта в случае ошибки 

  imagefill($image, 0, 0, 0x000000);  // белый фон

  // рисуем столбцы 
  $x = GRAPH_OFFSET_LEFT; 
  $y = GRAPH_OFFSET_TOP + $col_maxheight; 
  $i = 0; 
  foreach($Data as $name => $value) { 
    imagefilledrectangle(              // рисуем сплошной прямоугольник
      $image, 
      $x, 
      $y - round($value*$col_maxheight/$max_value), 
      $x + $col_width - 1, 
      $y, 
      $colors[$i++%count($colors)]
    );

    // Выводим текст:
$text = date("D",$name);
	
	

	
    // .. расчет координат...
    $coord = imagettfbbox(FONT_SIZE,0,FONT_NAME,$text);
      $text_x = $x + ($col_width - $coord[2] - $coord[0]) / 2;
    $text_y = GRAPH_HEIGHT - 10;
    // .. и вывод текста
    imagettftext($image,FONT_SIZE,0,$text_x,$text_y,0xCCCCCC,FONT_NAME,$text);

    $x += $col_width;
  } 



  // рисуем координатную ось 
  imageline($image, GRAPH_OFFSET_LEFT - 5, GRAPH_OFFSET_TOP, 
            GRAPH_OFFSET_LEFT - 5, $y, 0xCCCCCC); 
  for($value=0; $value<=$max_value; $value++) {
    imageline($image, GRAPH_OFFSET_LEFT - 7, $Y = $y - round($value*$col_maxheight/$max_value), 
            GRAPH_OFFSET_LEFT - 5, $Y, 0xCCCCCC); 
    imagestring($image, 1, GRAPH_OFFSET_LEFT / 2, $Y - 4, $value, 0xCCCCCC);
  }

  imagepng($image); 
  header('Content-type: image/png'); 
  imagedestroy($image);


Как выглядет сейчас http://imageshack.us/photo/my-images/35/crtstatp.png/

тоесть сейчас если в базе имеются одинаковые дни то они тупа дублируються по очереди!


а надо чтобы нижняя графа имела следующий вид Tue,Fri,Sat, San,Mon,Wed,Thu

тоесть дни недели, и если $text = 'Tue'; то все значения Tue подставляються в графу Tue а не дублируються по очереди!)
p.s: В php я нуб!!! )

Аватара пользователя
AgentSIB
Сообщения: 329
Зарегистрирован: 17.05.2010
Видимо даты неверно в массив заносишь. Проверяй выборку.
Frustra fit per plura quod potest fieri per pauciora © Закон "Бритвы Оккама"

mkden
Сообщения: 96
Зарегистрирован: 08.05.2010
занашу верно в униксе но заносятся они каждые 5 мин тоесть одна дата но разное время вот мне и надо если одинакавые даты то лажить в графике друг на друга а не поочеради!
p.s: В php я нуб!!! )

Аватара пользователя
AgentSIB
Сообщения: 329
Зарегистрирован: 17.05.2010
Я еще раз говорю, выборка не та. Тут нужна агрегация.
Попробуй так

Код: Выделить всё

SELECT UNIX_TIMESTAMP(DATE_FORMAT(date,'%Y-%m-%d 00:00:00')) AS ddate, SUM(chislo) chislo FROM table WHERE id = 58 AND date>".strtotime('-1 month')." GROUP BY ddate ORDER BY ddate
И замени

Код: Выделить всё

$Data[$data2['date']] = $data2['chislo'];
на

Код: Выделить всё

$Data[$data2['ddate']] = $data2['chislo'];
B вообще chislo - это быдлокод.
Frustra fit per plura quod potest fieri per pauciora © Закон "Бритвы Оккама"

mkden
Сообщения: 96
Зарегистрирован: 08.05.2010
Ни какая агрегация не нужна выборку оставил туже просто построение самого графика надо было переделать вот что в итоге получилось

http://www.mkgamemonitor.ru/player/I%20 ... 00x100.png

а по поводу chislo так его в базе нет и в коде тоже это я исправил чтоб было понятней!
p.s: В php я нуб!!! )

Аватара пользователя
AgentSIB
Сообщения: 329
Зарегистрирован: 17.05.2010
mkden
Вот ты сначала понаисправляешь, а потом жалуешься на неверные ответы :))) Нужно было с примером данных выкладывать. Тот запрос, что я написал будет работать в обоих случаях.
Frustra fit per plura quod potest fieri per pauciora © Закон "Бритвы Оккама"

Ответить