<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF116%3AJpGraph</id>
		<title>LXF116:JpGraph - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF116%3AJpGraph"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF116:JpGraph&amp;action=history"/>
		<updated>2026-05-13T00:22:48Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF116:JpGraph&amp;diff=9655&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF116:JpGraph&amp;diff=9655&amp;oldid=prev"/>
				<updated>2010-02-04T12:09:58Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''JpGraph''''' Добавьте графики  в свои PHP-сценарии!&lt;br /&gt;
&lt;br /&gt;
==Графики и диаграммы==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/JpGraph}}&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 2''' Не нашли ничего по душе в '''Сравнении''' этого месяца? Не расстраивайтесь – '''Никита Шультайс''' покажет, как создавать диаграммы Ганта из ''PHP'', и вы мигом нарисуете себе нужную функциональность.&lt;br /&gt;
&lt;br /&gt;
В прошлый раз мы познакомились с возможностями ''PHP''-библиотеки ''JpGraph'' по части создания линейных графиков и гистограмм на примере посещаемости воображаемого web-сайта. Излишне говорить, что этим возможности ''JpGraph'' не исчерпываются. Наш сегодняшний урок мы начнем с круговых диаграмм. Мы уже предоставили посетителям сведения о годовой и суточной посещаемости, но будущим рекламодателям может быть мало и этого: их интересуют демографические данные, например, возраст и пол пользователей. Ну что же, не будем их разочаровывать и добавим следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
  1 include ( &amp;quot;./jpgraph/src/jpgraph.php&amp;quot;);&lt;br /&gt;
  2 include (&amp;quot;./jpgraph/src/jpgraph_pie.php&amp;quot;);&lt;br /&gt;
  3&lt;br /&gt;
  4 $data = array(2.2, 7.5, 26.5, 31, 15.4, 11.8, 7.6);&lt;br /&gt;
  5&lt;br /&gt;
  6 $graph = new PieGraph(600,400);&lt;br /&gt;
  7 $graph-&amp;gt;SetShadow();&lt;br /&gt;
  8&lt;br /&gt;
  9 $graph-&amp;gt;title-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL);&lt;br /&gt;
  10 $graph-&amp;gt;title-&amp;gt;Set('Демография сайта (возраст посетителей)');&lt;br /&gt;
  11 $graph-&amp;gt;legend-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL);&lt;br /&gt;
  12&lt;br /&gt;
  13 $plot = new PiePlot($data);&lt;br /&gt;
  14 $legends = array('младше 12','12-18','19-24','25-30','31-35','36-40','старше 40');&lt;br /&gt;
  15 $plot-&amp;gt;SetLegends($legends);&lt;br /&gt;
  16 $plot-&amp;gt;SetCenter(0.35);&lt;br /&gt;
  17&lt;br /&gt;
  18 $graph-&amp;gt;Add($plot);&lt;br /&gt;
  19 $graph-&amp;gt;Stroke();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка | Содержание= [[Изображение:LXF116_80_1.jpg|300px | Рис. 1]] Рис. 1. Круговая диаграмма ''JpGraph'' тоже по плечу. | Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Все методы и функции для круговых диаграмм имеют тот же смысл, что и для линейных графиков и гистограмм, изученных на прошлом уроке. Разве что в строке 7 мы добавляем изображению тень, а в строке 16 центрируем диаграмму. Однако при построении круговых диаграмм следует иметь в виду следующие вещи:&lt;br /&gt;
* по умолчанию, данные на диаграмме высчитываются в процентах;&lt;br /&gt;
* цвета для каждой из частей диаграммы подбираются автоматически;&lt;br /&gt;
* первая секция отсчитывается от нулевого градуса (3 часа на циферблате).&lt;br /&gt;
&lt;br /&gt;
Мы всегда можем изменить эти установки. Например, метод:&lt;br /&gt;
&lt;br /&gt;
 $plot-&amp;gt;SetStartAngle(90);&lt;br /&gt;
&lt;br /&gt;
повернет нашу диаграмму на 90 градусов против часовой стрелки, и первая секция будет отсчитываться от 12 часов. Нумерация секций также идет против часовой стрелки. Будьте аккуратны с этим методом, так как он может неверно рассчитать смещение числовых подписей к секциям, и диаграмма станет непонятной. Да и потом будут возникать проблемы в отображении при применении других функций.&lt;br /&gt;
&lt;br /&gt;
Вызов '''$plot-&amp;gt;SetColor('red')'''; покрасит линии вокруг секций в красный цвет (по умолчанию установлен черный). Чтобы добиться оптимального размера диаграммы, вы можете поиграть с '''SetSize()''': здесь мы используем значение '''0.35''':&lt;br /&gt;
&lt;br /&gt;
 $plot-&amp;gt;SetSize(0.35);&lt;br /&gt;
&lt;br /&gt;
Вы также можете вручную задавать цвет каждой из секций – для этого добавьте в код следующие строки:&lt;br /&gt;
&lt;br /&gt;
 $colors = array('black','white','red','green','blue','yellow','pink');&lt;br /&gt;
 $plot-&amp;gt;SetSliceColors($colors);&lt;br /&gt;
&lt;br /&gt;
''JpGraph'' позволяет отображать и круговые 3D-диаграммы. Для этого нужно подключить модуль '''JpGraph_pie3d.php''':&lt;br /&gt;
&lt;br /&gt;
 include (&amp;quot;./jpgraph/src/jpgraph_pie3d.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
а затем заменить строку 13 на&lt;br /&gt;
&lt;br /&gt;
 $plot = new PiePlot3D($data);&lt;br /&gt;
&lt;br /&gt;
У 3D-диаграмм есть дополнительный метод:&lt;br /&gt;
&lt;br /&gt;
 $plot-&amp;gt;SetAngle(50);&lt;br /&gt;
&lt;br /&gt;
принимающий значения от '''5''' до '''85''' и отвечающий за управление перспективой. Не путайте его с методом '''SetStartAngle()''', который мы разбирали выше.&lt;br /&gt;
&lt;br /&gt;
Часто бывает нужно выделить из диаграммы определенный сегмент, например, отвечающий за посетителей в возрасте от 19 до 24 лет. Для этого можно применить метод&lt;br /&gt;
&lt;br /&gt;
 ExplodeSlice()&lt;br /&gt;
 $plot-&amp;gt;ExplodeSlice(2);&lt;br /&gt;
&lt;br /&gt;
принимающий в качестве аргумента номер элемента массива (не забывайте, что ''PHP'' отсчитывает их от нуля). Если вызвать '''$plot-&amp;gt;ExplodeAll()'''; то все сегменты диаграммы будут отделены друг от друга, а если вы хотите выделить несколько сегментов, да&lt;br /&gt;
еще и задать величину отступа, то используйте метод '''Explode()''', например:&lt;br /&gt;
&lt;br /&gt;
 $plot-&amp;gt;Explode(array(0,0,20,0,20,0,0));&lt;br /&gt;
&lt;br /&gt;
Последним методом, который мы удостоим своим вниманием в этом разделе, будет '''SetLabelPos()''', который, по возможности, старается разместить данные внутри секций:&lt;br /&gt;
&lt;br /&gt;
 $plot-&amp;gt;SetLabelPos(0.6);&lt;br /&gt;
&lt;br /&gt;
===Карты изображений===&lt;br /&gt;
&lt;br /&gt;
Помимо построения диаграмм, ''JpGraph'' может генерировать карты изображений, позволяющие сделать части картинки ссылками на разные ресурсы. Чтобы назначить такую карту, нужно сначала определить адреса для каждой из секций:&lt;br /&gt;
&lt;br /&gt;
  $url1 = ‘http://mysite.ru/1.html’;&lt;br /&gt;
  $url2 = ‘http://mysite.ru/2.html’;&lt;br /&gt;
  ...&lt;br /&gt;
  $url7 = ‘http://mysite.ru/7.html’;&lt;br /&gt;
  $targetarray = array($url1, $url2, $url3, $url4, $url5, $url6, $url7);&lt;br /&gt;
&lt;br /&gt;
а затем добавить их на диаграмму:&lt;br /&gt;
&lt;br /&gt;
  $plot-&amp;gt;SetCSIMTargets($targetarray);&lt;br /&gt;
&lt;br /&gt;
и заменить строку&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;Stroke();&lt;br /&gt;
&lt;br /&gt;
строкой&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;StrokeCSIM();&lt;br /&gt;
&lt;br /&gt;
которая выведет изображение вместе с картой в текущий файл. Теперь, щелкнув на любую из областей или на элемент легенды, мы перейдем по заданному нами адресу.&lt;br /&gt;
&lt;br /&gt;
===Диаграммы Ганта===&lt;br /&gt;
&lt;br /&gt;
Если по-простому, диаграммы Ганта – это графическое представление задач и ресурсов какого-либо проекта во времени. Мы всегда можем узнать, какие задачи выполняются сейчас, какие уже выполнены и за какие предстоит взяться в будущем. С помощью диаграмм Ганта менеджер может контролировать ход выполнения проекта и вносить коррективы, если заметно отставание от плана, а также грамотно распределять ресурсы для решения разных задач. Как вы уже знаете ([[LXF115:JpGraph|LXF115]]), ''JpGraph'' содержит модуль для построения диаграмм Ганта. Он позволяет:&lt;br /&gt;
* автоматически или вручную масштабировать график в зависимости от даты;&lt;br /&gt;
* выбирать при масштабировании между месяцами, неделями, днями, часами и минутами;&lt;br /&gt;
* графически представлять сгруппированные задачи;&lt;br /&gt;
* создавать неограниченное число задач...&lt;br /&gt;
&lt;br /&gt;
...и так далее.&lt;br /&gt;
&lt;br /&gt;
По традиции, начнем сразу с примера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
  1 &amp;lt;?php&lt;br /&gt;
  2 include ( &amp;quot;./jpgraph/src/jpgraph.php&amp;quot;);&lt;br /&gt;
  3 include (&amp;quot;./jpgraph/src/jpgraph_gantt.php&amp;quot;);&lt;br /&gt;
  4&lt;br /&gt;
  5 $graph = new GanttGraph(-1,-1);&lt;br /&gt;
  ...&lt;br /&gt;
  11 $graph-&amp;gt;scale-&amp;gt;SetDateLocale(&amp;quot;ru_RU.UTF-8&amp;quot;);&lt;br /&gt;
  12&lt;br /&gt;
  13 $graph-&amp;gt;ShowHeaders( GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH);&lt;br /&gt;
  14&lt;br /&gt;
  15 $graph-&amp;gt;scale-&amp;gt;month-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  16 $graph-&amp;gt;scale-&amp;gt;month-&amp;gt;SetStyle(MONTHSTYLE_SHORTNAMEYEAR2);&lt;br /&gt;
  17 $graph-&amp;gt;scale-&amp;gt;month-&amp;gt;SetBackgroundColor(&amp;quot;blue&amp;quot;);&lt;br /&gt;
  18&lt;br /&gt;
  19 $graph-&amp;gt;scale-&amp;gt;week-&amp;gt;SetStyle(WEEKSTYLE_FIRSTDAY);&lt;br /&gt;
  20 $graph-&amp;gt;scale-&amp;gt;week-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  21&lt;br /&gt;
  22 $graph-&amp;gt;scale-&amp;gt;day-&amp;gt;SetStyle(DAYSTYLE_SHORTDATE4);&lt;br /&gt;
  23 $graph-&amp;gt;scale-&amp;gt;day-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  24&lt;br /&gt;
  25 $task1 = new GanttBar(0,&amp;quot;Проектирование&amp;quot;, &amp;quot;11.01.2009&amp;quot;, &amp;quot;25.01.2009&amp;quot;);&lt;br /&gt;
  26 $task1-&amp;gt;SetPattern(BAND_RDIAG, &amp;quot;yellow&amp;quot;);&lt;br /&gt;
  27 $task1-&amp;gt;SetHeight(12);&lt;br /&gt;
  28 $task1-&amp;gt;SetFillColor(&amp;quot;red&amp;quot;);&lt;br /&gt;
  29 $task1-&amp;gt;title-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  30 $task1-&amp;gt;title-&amp;gt;SetColor(&amp;quot;red&amp;quot;);&lt;br /&gt;
  31&lt;br /&gt;
  32 $task2 = new GanttBar(1,&amp;quot;Программирование&amp;quot;, &amp;quot;25.01.2009&amp;quot;, &amp;quot;03.02.2009&amp;quot;);&lt;br /&gt;
  ...&lt;br /&gt;
  35 $task3 = new GanttBar(2,&amp;quot;Тестирование&amp;quot;, &amp;quot;03.02.2009&amp;quot;, &amp;quot;06.02.2009&amp;quot;);&lt;br /&gt;
  …&lt;br /&gt;
  38 $graph-&amp;gt;Add($task1);&lt;br /&gt;
  39 $graph-&amp;gt;Add($task2);&lt;br /&gt;
  40 $graph-&amp;gt;Add($task3);&lt;br /&gt;
  43 ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Многие части программы вам уже знакомы, поэтому здесь мы обратим внимание на новинки – полный текст сценария находится на '''LXFDVD'''. Первое, что бросается в глаза – значения ширины и высоты, переданные в конструктор ''GanttGraph()'', равны '''-1''', что позволяет вычислять их автоматически. В строке 11 задается локаль нашей системы, чтобы дата и время выводились по-русски. Это очень ответственное место, ведь если вы неправильно укажете название вашей локали, то в лучшем случае получите «крякозябры», а в худшем – график просто не будет создан. Чтобы не ошибиться, наберите в консоли ''locale'' и скопируйте полученное значение в исходник. В строке 13 мы перечисляем,&lt;br /&gt;
какие заголовки должны отображаться в диаграмме: дни, недели и месяцы, то есть при просмотре мы всегда сможем определить время выполнения с точностью до дней и увидеть, на сколько недель или месяцев растянулась та или иная задача.&lt;br /&gt;
&lt;br /&gt;
В строке 16 задается стиль масштабирования для месяцев. Здесь доступно несколько вариантов: '''MONTHSTYLE_SHORTNAME''' (только краткое название), '''MONTHSTYLE_LONGNAME''' (полное название), '''MONTHSTYLE_FIRSTLETTER''' (первая буква) и несколько комбинированных форматов: '''MONTHSTYLE_SHORTNAMEYEAR4, MONTHSTYLE_LONGNAMEYEAR2, MONTHSTYLE_LONGNAMEYEAR4'''. Аналогично, в строке 19 указывается стиль масштабирования для недель. Значение '''WEEKSTYLE_FIRSTDAY''' выводит дату первого дня недели в формате ДД/ММ, где ДД – день, а ММ – месяц.&lt;br /&gt;
На выбор представлено еще несколько параметров: '''WEEKSTYLE_FIRSTDAY2''' – дата первого дня недели в формате «01 Янв», '''WEEKSTYLE_WNBR''' – номер недели с начала года, и два комбинированных формата, с которыми вы без труда разберетесь: '''WEEKSTYLE_FIRSTDAYWNBR''' и '''WEEKSTYLE_FIRSTDAY2WNBR'''.&lt;br /&gt;
&lt;br /&gt;
Определение формата вывода дня недели находится в строке 22. Помимо '''DAYSTYLE_SHORTDATE4''' (номер дня в месяце), можно использовать:&lt;br /&gt;
* '''DAYSTYLE_ONELETTER''' За день недели отвечает только одна буква, например, «П» для понедельника (иногда работает некорректно).&lt;br /&gt;
* '''DAYSTYLE_LONG''' Полное название дня недели, например, «Понедельник».&lt;br /&gt;
* '''DAYSTYLE_LONGDAYDATE1''' День и дата: «Понедельник 23 Июня».&lt;br /&gt;
* '''DAYSTYLE_SHORT''' Краткое название дня, например, «Пн.», а также некоторые другие.&lt;br /&gt;
&lt;br /&gt;
Кроме определения параметров масштабирования, отображение дней можно настроить с помощью дополнительных методов:&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt;day-&amp;gt;SetWeekendColor('green'); // устанавливаем цвет столбцов для выходных&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt;day-&amp;gt;SetSundayFontColor('blue'); // устанавливаем цвет шрифта для формата вывода воскресенья&lt;br /&gt;
&lt;br /&gt;
а с помощью&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt;UseWeekendBackground(false);&lt;br /&gt;
&lt;br /&gt;
можно вообще отключить закраску выходных.&lt;br /&gt;
&lt;br /&gt;
{{Врезка | Содержание= [[Изображение:LXF116_82_1.jpg|300px | Рис. 2]] Рис. 2. Диаграмма Ганта — неотъемлемый атрибут любого процесса&lt;br /&gt;
управления проектами. | Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
В строке 25 мы создаем первую задачу. Первый параметр ('''0'''), переданный в конструктор, отвечает за ее порядковый номер. Как и массивы, задачи нумеруются с нуля, и чем больше номер, тем ниже расположена задача на диаграмме. Следующий параметр отвечает за название задачи, затем идут даты начала и окончания. Параметры отображения диаграммы приведены в строках 26–30. В строках 32 и 35 мы создаем еще две задачи, присваивая им соответственно порядковые номера 1 и 2 (имеются в виду номера, которые передаются в конструктор, а не приписываются&lt;br /&gt;
к названиям переменных). В строках 38–40 задачи помещаются на график.&lt;br /&gt;
&lt;br /&gt;
Посмотреть, что у нас получилось, можно на рис. 2. Взгляните также на экранные снимки в '''Сравнении''' этого месяца –&lt;br /&gt;
по-моему, вышло не хуже.&lt;br /&gt;
&lt;br /&gt;
===Расширяем диаграммы===&lt;br /&gt;
&lt;br /&gt;
Диаграммы Ганта позволяют рассматривать задачи как минимум в трех временных диапазонах: что сделано, что делается сейчас и что надо сделать. Чтобы было проще понять, что происходит в настоящий момент, можно поместить на график вертикальную линию:&lt;br /&gt;
&lt;br /&gt;
  $vline = new GanttVLine(&amp;quot;28.01.2009&amp;quot;, &amp;quot;Сегодня&amp;quot;, &amp;quot;darkred&amp;quot;, 4, &amp;quot;solid&amp;quot;);&lt;br /&gt;
  $vline-&amp;gt;title-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  $graph-&amp;gt;Add($vline);&lt;br /&gt;
&lt;br /&gt;
В конструктор '''GanttVLine()''' передаются: дата, сноска, цвет и толщина линии, а также стиль отображения ('''solid''' – непрерывная линия, '''dashed''' – пунктир, '''dotted''' – точки). Вертикальные линии могут использоваться не только для отметки текущего момента,&lt;br /&gt;
но и для разметки различных фаз, которые могут охватывать сразу несколько задач.&lt;br /&gt;
&lt;br /&gt;
Помимо отображения задач, выполняющихся во времени, на диаграмму можно наносить «одноразовые» действия: например, промежуточные отчеты перед начальством или утверждения дизайна заказчиком. Это делает следующий кусок кода:&lt;br /&gt;
&lt;br /&gt;
  $milestone = new MileStone(3,&amp;quot;Подготовка сервера&amp;quot;,&amp;quot;2009-01-31&amp;quot;,&amp;quot;(2009-01-31)&amp;quot; );&lt;br /&gt;
  $milestone-&amp;gt;mark-&amp;gt;SetType(MARK_DTRIANGLE);&lt;br /&gt;
  $milestone-&amp;gt;title-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  $milestone-&amp;gt;title-&amp;gt;SetColor(&amp;quot;black&amp;quot;);&lt;br /&gt;
  $milestone-&amp;gt;caption-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  $milestone-&amp;gt;caption-&amp;gt;SetCo&amp;quot;lor(&amp;quot;black&amp;quot;);&lt;br /&gt;
  $graph-&amp;gt;Add($milestone);&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что в качестве первого параметра в конструктор передается 3 – порядковый номер задачи на диаграмме. Остальные опции просты и не требуют дополнительных разъяснений.&lt;br /&gt;
&lt;br /&gt;
Здорово, когда мы идем точно по плану или с опережением, но зачастую программисты выполняют работу с опозданием и, соответственно, не укладываются в бюджет. Поэтому стоит контролировать не только то, какие задачи сейчас выполняются, но и процент завершения для каждой из них. Для этого используются индикаторы прогресса:&lt;br /&gt;
&lt;br /&gt;
  $task1-&amp;gt;progress-&amp;gt;Set(1.0);&lt;br /&gt;
  $task1-&amp;gt;progress-&amp;gt;SetPattern( BAND_RDIAG, &amp;quot;blue&amp;quot;);&lt;br /&gt;
  $task2-&amp;gt;progress-&amp;gt;Set(0.2);&lt;br /&gt;
  $task2-&amp;gt;progress-&amp;gt;SetPattern( BAND_RDIAG, &amp;quot;blue&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
В метод '''Set()''' передается число от '''0''' (задача еще не начинала выполняться) до '''1''' (задача выполнена на 100%). На нашей диаграмме мы отстаем от плана на задаче «программирование».&lt;br /&gt;
&lt;br /&gt;
Иногда задача длится во времени так долго, что диаграмма становится слишком широкой, чтобы поместиться на экран. Для таких случаев можно:&lt;br /&gt;
&lt;br /&gt;
а) Определить интервал времени, на который будет проецироваться диаграмма:&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;SetDateRange(&amp;quot;22.01.2009&amp;quot;, &amp;quot;03.02.2009&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
б) Дать каждой задаче описание, чтобы всегда видеть, когда она началась, а когда – заканчивается. Для этого нужно добавить дополнительные поля&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt;actinfo-&amp;gt;SetColTitles(array('Задача' , 'Начало','Конец'),array( 30,100));&lt;br /&gt;
&lt;br /&gt;
и заменить в конструкторе GanttBar название задачи на массив, в котором каждый элемент соответствует определенным выше полям:&lt;br /&gt;
&lt;br /&gt;
  $task1 = new GanttBar(0, array(&amp;quot;Проектирование&amp;quot;,'11.01.2009','25.01.2009'), &amp;quot;11.01.2009&amp;quot;, &amp;quot;25.01.2009&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Осталось лишь придать дополнительным полям приятный вид:&lt;br /&gt;
&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt;actinfo-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL,10);&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt;actinfo-&amp;gt;SetBackgroundColor('#E0DBFF');&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt; actinfo-&amp;gt;vgrid-&amp;gt;SetStyle ('solid');&lt;br /&gt;
  $graph-&amp;gt;scale-&amp;gt; actinfo-&amp;gt;vgrid-&amp;gt;SetColor ('gray');&lt;br /&gt;
&lt;br /&gt;
и добавить горизонтальную «зебру»:&lt;br /&gt;
&lt;br /&gt;
 $graph-&amp;gt;hgrid-&amp;gt;Show();&lt;br /&gt;
 $graph-&amp;gt;hgrid-&amp;gt;SetRowFillColor('darkblue@0.9');&lt;br /&gt;
&lt;br /&gt;
Выполнение многих задач начинается только после завершения предыдущих: например, нельзя начинать тестирование, пока нет рабочей версии программы. Для этих целей в диаграммы Ганта добавляют зависимости:&lt;br /&gt;
&lt;br /&gt;
 $task1-&amp;gt;SetConstrain(1,CONSTRAIN_ENDSTART);&lt;br /&gt;
&lt;br /&gt;
Это значит, что по завершении задачи '''$task1''' начнет выполняться задача с порядковым номером '''1''' (у нас это '''$task2'''). Конечно, данный пример наигран, да и вообще – многие зависимости в разработке программ очевидны, поэтому лучше тратить время не на их рисование, а на написание кода: мы ведь и так отстаем от графика.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF116_82_2.jpg|600px | Рис 3.]] &lt;br /&gt;
&lt;br /&gt;
Рис. 3. Пара дополнительных строк кода — и ваша диаграмма выглядит не хуже, чем в ''MS Project''.&lt;br /&gt;
&lt;br /&gt;
===Любителям физики===&lt;br /&gt;
&lt;br /&gt;
В прошлый раз мы посмотрели, как ''JpGraph'' может помочь математикам в построении графиков функций; а сегодня поможем физикам. Если сильно раскачать качели и оставить их на произвол судьбы, то они постепенно остановятся. Это происходит потому, что все колебания, которым мы не помогаем, рано или поздно затухают. Особую ценность представляет визуализация таких колебаний.&lt;br /&gt;
&lt;br /&gt;
Для начала позвольте немного теории. Почти любое затухающее колебание можно представить формулой:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF116_83_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
где '''А''' – амплитуда (то, насколько сильно качели отклонятся от положения равновесия), '''А0''' – начальная амплитуда (отклонение в тот момент, когда мы перестали раскачивать качели), '''e''' – константа Эйлера, равная 2,71828..., '''k''' – коэффициент затухания (чем он больше, тем быстрее остановятся качели), '''t''' – время, которое прошло с момента начала самостоятельных колебаний, '''ω''' – угловая частота и '''ϕ''' – начальная фаза колебаний. Теперь, когда у нас есть формула и ''JpGraph'', можно пробовать построить график затухающих колебаний:&lt;br /&gt;
&lt;br /&gt;
{{Врезка | Содержание= [[Изображение:LXF116_83_2.jpg|300px | Рис. 4]]  Рис. 4. По-научному это можно назвать осциллограммой затухающих колебаний. | Ширина=300px}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
 1 &amp;lt;?php&lt;br /&gt;
 2 include ( &amp;quot;./jpgraph/src/jpgraph.php&amp;quot;);&lt;br /&gt;
 3 include (&amp;quot;./jpgraph/src/jpgraph_scatter.php&amp;quot;);&lt;br /&gt;
 4&lt;br /&gt;
 5 $numpoints=50;&lt;br /&gt;
 6 $k=0.05;&lt;br /&gt;
 7&lt;br /&gt;
 8 for($t=0; $t&amp;lt;$numpoints; ++$t) {&lt;br /&gt;
 9    $datay[$t]=exp(-$k*$t)*cos(M_PI/10*$t);&lt;br /&gt;
 10 }&lt;br /&gt;
 11&lt;br /&gt;
 12 $graph = new Graph(400,200);&lt;br /&gt;
 13 $graph-&amp;gt;SetScale(&amp;quot;intlin&amp;quot;);&lt;br /&gt;
 14 $graph-&amp;gt;SetShadow();&lt;br /&gt;
 15 $graph-&amp;gt;SetBox();&lt;br /&gt;
 16&lt;br /&gt;
 17 $graph-&amp;gt;title-&amp;gt;Set(&amp;quot;Затухающие колебания&amp;quot;);&lt;br /&gt;
 18 $graph-&amp;gt;title-&amp;gt;SetFont(FF_VERDANA,FS_NORMAL);&lt;br /&gt;
 19&lt;br /&gt;
 20 $graph-&amp;gt;xaxis-&amp;gt;SetPos(&amp;quot;min&amp;quot;);&lt;br /&gt;
 21&lt;br /&gt;
 22 $graph-&amp;gt;yaxis-&amp;gt;SetLabelMargin(12);&lt;br /&gt;
 23 $graph-&amp;gt;xaxis-&amp;gt;SetLabelMargin(6);&lt;br /&gt;
 24 $graph-&amp;gt;yaxis-&amp;gt;SetTickSide(SIDE_LEFT);&lt;br /&gt;
 25 $graph-&amp;gt;xaxis-&amp;gt;SetTickSide(SIDE_DOWN);&lt;br /&gt;
 26&lt;br /&gt;
 27 $sp1 = new ScatterPlot($datay);&lt;br /&gt;
 28 $sp1-&amp;gt;mark-&amp;gt;SetType(MARK_SQUARE);&lt;br /&gt;
 29 $sp1-&amp;gt;mark-&amp;gt;SetFillColor(&amp;quot;red&amp;quot;);&lt;br /&gt;
 30 $sp1-&amp;gt;SetImpuls();&lt;br /&gt;
 31 $sp1-&amp;gt;SetColor(&amp;quot;blue&amp;quot;);&lt;br /&gt;
 32 $sp1-&amp;gt;SetWeight(1);&lt;br /&gt;
 33 $sp1-&amp;gt;mark-&amp;gt;SetWidth(3);&lt;br /&gt;
 34&lt;br /&gt;
 35 $graph-&amp;gt;Add($sp1);&lt;br /&gt;
 36&lt;br /&gt;
 37 $graph-&amp;gt;Stroke();&lt;br /&gt;
 38 ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В строке 3 мы подключаем библиотеку для создания графиков разбросов точечных значений, а затем задаем число точек и коэффициент затухания k (строки 5 и 6 соответственно). Можете изменять значения переменной '''k''', чтобы посмотреть, как ведут себя колебания. В строках 8–11 вычисляются значения по оси y или, иными словами, амплитуды в определенные моменты времени, ведь в строке 9 записана формула затухающих колебаний, только на ''PHP''. Далее идет создание графика и вызывается новый для нас метод '''SetBox()''', который добавляет рамку вокруг области, в которой строится график. В строке 20 мы устанавливаем ось '''x''' внизу, а не посередине, как это задано по умолчанию. В строках&lt;br /&gt;
22–25 определяется величина отступов и направления отметок значений на осях. И начиная с 27 строки, создается график, который помещается на изображение в строке 35.&lt;br /&gt;
&lt;br /&gt;
{{Врезка | Содержание= [[Изображение:LXF116_83_3.jpg|300px | Рис. 5]]  Рис. 5. Метателю этого мяча надо бы поупражняться в точности или выбрать место побезветреннее.| Ширина=300px}} &lt;br /&gt;
&lt;br /&gt;
Я уже упомянул, что мы подключаем библиотеку для создания графиков разбросов точек: обычно этот модуль применяется для определения зон, в которых какое-нибудь событие происходило наиболее часто. Если мы будем бросать мяч с одной силой, под одним углом и в одну сторону, то он будет падать примерно в одно и то же место, и только иногда значения будут отклоняться, например, из-за неожиданного порыва ветра (рис. 5).&lt;br /&gt;
&lt;br /&gt;
Построив такой график и проанализировав значения, можно рассчитать, сколько нужно сделать бросков, чтобы наверняка попасть в цель, учитывая возможные отклонения и даже то, какие объекты могут пострадать в случае максимального отклонения. &lt;br /&gt;
&lt;br /&gt;
На этом изучение бесплатной (и свободной!) части библиотеки ''JpGraph'' можно считать законченным. Покупку и исследование возможностей профессиональной версии в части печати штрихкодов оставляем заинтересованному читателю в качестве домашнего задания. '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>