Графики на PHP
Одним и способов создания графиков средствами PHP является использование библиотеки JpGraph
http://www.aditus.nu/jpgraph/about.php
Очень мощный и удобный для понимания с расписанным API классов.
Взять можно тут:
http://www.aditus.nu/jpgraph/jpdownload.php
В виде примера мы напишем вывод графика курса валют Доллара и Евро.
1. Для начала скачаем архив с библиотекой
2. Разархивируем ее в нужную Вам директорию
3. открываем файлик:
jpgraph/src/jpg-config.inc.php
— Если используем уникальные шрифты, то указываем путь до директории где они будут лежать:
DEFINE("TTF_DIR",$DR."/inc/fonts/");
— Устанавливаем директории кеша если нужна:
DEFINE("USE_CACHE",false); DEFINE("CSIMCACHE_DIR","/upload/jpgraph/"); DEFINE("CSIMCACHE_HTTP_DIR","/upload/jpgraph/"); DEFINE("CACHE_FILE_GROUP","wwwadmin"); DEFINE("CACHE_FILE_MOD",0664);
— говорим по «русски»:
DEFINE("CYRILLIC_FROM_WINDOWS",true); DEFINE('CYRILLIC_LANGUAGE_CHARSET', 'windows-1251'); DEFINE('DEFAULT_ERR_LOCALE','ru'); // хотя там русского языка нет :)
4. Сохраняем изменения
5. Создаем тестовый файл graph.php в который пихаем следующий код:
// если скрипту передан параметр SHOW то генерируем на вывод изображение >if (isset($_GET['show'])) { // подключаем библиотеку include ('jpgraph/src/jpgraph.php'); include ('jpgraph/src/jpgraph_line.php' ); // Создаем график размером 460х180 $graph = new Graph(460, 180,"auto"); // устанавливаем фон или дефолтный или тот который передали через URL if (isset($_GET['bgcolor'])) $color_bg = $_GET['bgcolor']; else $color_bg = '#FFF5C3'; // Устанавливаем параметры области прорисовки графика // цвет $graph->SetMarginColor($color_bg); // тип графика $graph->SetScale("textlin"); // цвет рамки $graph->SetFrameBevel(0,false,$color_bg); // отступы с краев $graph->SetMargin(45,10,20,42); // получаем данные из базы данных // таблица: id,date,dollar,euro $pilot = $dollars = $euros = array(); $r = mysql_query('SELECT * FROM info_cash ORDER BY id DESC LIMIT 31'); $i=0; while ($d = mysql_fetch_assoc($r)) { $i++; $dollars[] = round($d['dollar'],2); $euros[] = round($d['euro'],2); // По оси Х выводим только через каждые 3 точки значения по оси if ($i==1 || $i>3) {$pilot[] = date('d.m',strtotime($d['date']));if ($i>3) {$i=1;} continue;} $pilot[] = ''; } // доп. настройки осей $graph->yaxis->HideZeroLabel(); $graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5'); $graph->xgrid->Show(); //USD - создаем график для доллара // подготавливаем данные $dollars = array_reverse($dollars); // создаем график $lineplot =new LinePlot($dollars); //цвет $lineplot ->SetColor("blue"); // ширина линии $lineplot ->SetWeight(2); // устанавливаем легенду $lineplot->SetLegend('USD'); //EURO - создаем график для евро все по аналогии с долларом $euros = array_reverse($euros); $lineplot2 =new LinePlot($euros); $lineplot2 ->SetColor("red"); $lineplot2 ->SetWeight(2); $lineplot2->SetLegend('EUR'); // добавляем на поле графика эти две "ломаные линии" $graph->Add( $lineplot); $graph->Add( $lineplot2); // устанавливаем параметры легенды (позиции и цвет) // тут создаем тень, красного цвета, с прозрачностью 90% и шириной 1 $graph->legend->SetShadow('red@0.9',1); // позиционируем (координаты от 0 до 1) $graph->legend->SetPos(0.091,0.031,'left','top'); // тут подготавливаем данные меток по оси Х $pilot = array_reverse($pilot); // настраиваем данные и поворачиваем на 90 градусов тексты $graph->xaxis->SetTickLabels($pilot); $graph->xaxis->SetLabelAngle(90); // по оси Y выставляем формат вывода чисел 35.00 $graph->yaxis->SetLabelFormat('%0.2f'); // график на вывод $graph->Stroke(); exit; } echo '<img src="graph.php?show" border=0 align=center width=460 height=180>';
ну вот в принципе и все, ничего сложного, но что бы было еще легче, в архиве библиотеки есть документация с примерами.
Удачи!

Судя по твоему описанию все очень хорошо и разобраться что к чему не составляет проблемы, но я не могу вывести ни одного графика даже из примеров!!! Выдает сообщение следующего типа:
Notice: Constant TTF_DIR already defined in D:\www\jpgraph\src\jpgraph.php on line 77
JpGraph Error: HTTP headers have already been sent.
Caused by output from file jpgraph.php at line 77.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it's image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).
Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.
For example it is a common mistake to leave a blank line before the opening «<?php».
И если с предупреждением все ясно, то с ошибкой библиотеки не могу понять откуда она.
Если есть возможность, то объясни Пожалуйста.
Максим
Привет.
нотис проверь, у тебя уже где-то объявлена define('TTF_DIR','...');
потом проверь echo TTF_DIR; что в ней, и указывает ли она на нужную папку со шрифтами (шрифты бери arial.ttf из /windows/fonts/)
потом, про то что хеадер руается — это из-за первой ошибки, но навсякий случай посмотри, что бы < ?php начинался с самого начала скрипта
после этого посмотри заработает или нет.
если нет, код мне сюда кинь, я посмотрю
Максим да и еще, в файле конфига все константы уже прописаны, ты их не добавляй заново, просто ищи и правь их, может ты дубликат сделал, вот оно и ругается
TTF_DIR C:/WINDOWS/fonts/
Константы только правил
jpgraph.php:
if (!defined('TTF_DIR')) {
if (strstr( PHP_OS, 'WIN') ) {
$sroot = getenv('SystemRoot');
if( empty($sroot) ) {
$t = new ErrMsgText();
$msg = $t->Get(12,$file,$lineno);
die($msg);
}
else {
define('TTF_DIR', $sroot.'/fonts/');
}
} else {
define('TTF_DIR','/usr/share/fonts/truetype/');
}
}
if (!defined('MBTTF_DIR')) {
if (strstr( PHP_OS, 'WIN') ) {
$sroot = getenv('SystemRoot');
if( empty($sroot) ) {
$t = new ErrMsgText();
$msg = $t->Get(12,$file,$lineno);
die($msg);
}
else {
define('TTF_DIR', $sroot.'/fonts/'); //Здесь ругается. Комментируешь, нотис пропадает, а ошибка остается, независимо строку или if целиком.
}
} else {
define('MBTTF_DIR','/usr/share/fonts/ja/TrueType/');
}
}
Теперь мой код, хотя ругается и на примеры из библиотеки.
<?
session_start();
if($_POST['userid'] && $_POST['pass'])
{
@ $db = mssql_pconnect(«Server»,"Login","Password");
if (!$db)
{
echo «Не могу соединиться с БД»;
echo 'Вернуться на главную';
exit;
}
mssql_select_db(«DB»);
$query="select IdCounter from OES_Counters where Counter_Type='".$_POST['userid']."' and Counter_Number='".$_POST['pass']."'";
$result=mssql_query($query);
if (mssql_num_rows($result)>0)
{
$_SESSION['valid_user'] = $_POST['userid'];
}
}
else
{
exit;
}
?>
WEB система просмотра показаний прибора учета Абонента
Тип прибора учета:
Номер прибора учета:
0)
{
echo "«;
echo „ДатаПоказание“;
// подключаем библиотеку
include ('jpgraph/src/jpgraph.php');
include ('jpgraph/src/jpgraph_line.php' );
echo TTF_DIR;
// Создаем график размером 460×180
$graph = new Graph(460, 180,»auto");
// устанавливаем фон или дефолтный или тот который передали через URL
$color_bg = '#FFF5C3';
// Устанавливаем параметры области прорисовки графика
// цвет
$graph->SetMarginColor($color_bg);
// тип графика
$graph->SetScale(«textlin»);
// цвет рамки
$graph->SetFrameBevel(0,false,$color_bg);
// отступы с краев
$graph->SetMargin(45,10,20,42);
$r=$cv=array();
$i=0;
while ($row=mssql_fetch_array($result))
{
$i++;
if ($i%2==0)
{
$r[]=date('Дата',strtotime($row['DReg']));
$cv[]=$row['CounterValue'];
echo " ";
echo $row['DReg'];
echo " ";
echo round($row['CounterValue'],3);
echo " ";
continue;
}
$r[]='';
}
echo "«;
echo „<input type=submit value=\“Выход\»";
// доп. настройки осей
$graph->yaxis->HideZeroLabel();
$graph->ygrid->SetFill(true,'#EFEFEF@0.5','#BBCCFF@0.5');
$graph->xgrid->Show();
//USD — создаем
// подготавливаем данные
$сv = array_reverse($cv);
// создаем график
$lineplot =new LinePlot($cv);
//цвет
$lineplot ->SetColor(«blue»);
// ширина линии
$lineplot ->SetWeight(2);
// устанавливаем легенду
$lineplot->SetLegend('График потребления ЭЭ');
// добавляем на поле графика эти две «ломаные линии»
$graph->Add( $lineplot);
// устанавливаем параметры легенды (позиции и цвет)
// тут создаем тень, красного цвета, с прозрачностью 90% и шириной 1
$graph->legend->SetShadow('red@0.9',1);
// позиционируем (координаты от 0 до 1)
$graph->legend->SetPos(0.091,0.031,'left','top');
// тут подготавливаем данные меток по оси Х
$r = array_reverse($r);
// настраиваем данные и поворачиваем на 90 градусов тексты
$graph->xaxis->SetTickLabels($r);
$graph->xaxis->SetLabelAngle(90);
// по оси Y выставляем формат вывода чисел 35.00
$graph->yaxis->SetLabelFormat('%0.2f');
// график на вывод
$graph->Stroke();
exit;
echo '';
}
else
{
echo «Запрос не выдал ни одного значения!»;
}
}
else
if(isset($_POST['userid']))
{
echo «Не получилось войти!»;
echo 'Вернуться на главную';
}
?>
Такс. а что за ошибка, все таже? даже из примера? скиншот или текст ошибки дай глянуть. проверь требования библиотеки совпадают ли с настройками PHP (TTF,GD,...)