« Управление сборкой проектов вместе с teamcity. Часть 3 | Графики и диаграммы на веб-страницах. Часть 2 » |
Графики и диаграммы на веб-страницах. Часть 1
Нет лучшего и более наглядного способа отображения больших таблиц с числовыми данными, чем отображение их в виде диаграмм или графиков. Применительно к отображению диаграмм на веб-страницах у разработчиков есть и богатство подходов и конкретных инструментов, позволяющих внедрять на html-страницы не только красивые, но и обладающие некоторой долей интерактивности диаграммы. Осенью 2007 года я уже поднимал вопрос о том, как мы можем внедрять в html-страницы диаграммы. Тогда серия из двух статей была посвящена методике, когда диаграммы строились на стороне сервера, т.е. некий php-скрипт генерировал статическую картинку диаграммы и отдавал ее браузеру клиента. В ряде случаев, когда нас не устраивала статическая картинка, то использовался подход с flash-роликом внедренным в страницу, который сначала загружал с сервера поток данных в виде xml или json массива, а затем рисовал диаграмму. Сегодняшняя статья рассмотрит третий подход, когда графики строятся без использования “тяжелой артиллерии” - с помощью javascript.Неправильным было бы говорить, что графики, построенные с помощью flash, заведомо лучше перед графиками, построенными на javascript или сгенерированными на стороне сервера с помощью php. Каждый из подходов имеет свои плюсы и минусы. Наиболее надежным и гарантированно работающим во всех ситуациях является подход с картинками диаграмм, созданными с помощью серверного php-скрипта. Недостатком является отсутствие какой-либо динамики на диаграммах, т.е. мы не можем масштабировать рисунок, динамически изменять просматриваемый диапазон значений, подгружать данные для отображения по требованию, т.е. без полной перезагрузки страницы или рисунка. Кроме того, в большинстве случаев диаграммы-картинки имеют слишком большой размер при передаче по сети. Всех этих недостатков лишены диаграммы, созданные с помощью javascript или flash. На рынке есть большое количество как платных, так и бесплатных библиотек, позволяющих строить графики с помощью flash. Однако если вы не располагаете знаниями в actionscript и flash, то эти библиотеки и создаваемые ими графики приходится рассматривать как “черные ящики”. Плюс, для создания хорошего и удобного интерфейса необходимы средства взаимодействия между javascript (ведь на нем и создается львиная доля обработчиков событий в html-страничке) и flash. Гораздо удобнее если и интерфейс веб-странички и графики управляются единым образом, т.е. с помощью javascript. Единственная неприятность в том, что изначально в стандарте javascript не предусматривалось каких-либо средств для рисования. Поэтому приходится “выкручиваться” с помощью смежных технологий, таких как svg, canvas, vml, которые, к сожалению, не поддерживались всеми браузерами. Так идеальным средством для рисования диаграмм, даже самых сложных, был бы canvas. Вкратце, canvas – это специальный тег, создающий на html-странице прямоугольную область рисования. Затем вы, вызывая javascript-функции, можете рисовать линии, полигоны, закрашивать области разными цветами. Если эта тема вас заинтересовала, то я опубликовал на своем сайте пару статей, рассказывающих о рисовании с помощью canvas (Тег html canvas. Часть 1 и Тег html canvas. Часть 2). Увы и ах, но поддержка тега canvas уже несколько лет есть и в opera и в firefox, но разработчики internet explorer, даже в последней восьмой версии браузера не спешат поддерживать требования стандарта html 5. Еще одним доступным инструментом рисования с помощью javascript является SVG. SVG – это текстовой, основанный на xml, формат для описания как статических, так и динамических изображений. Подобно тому, как мы с помощью html тегов создаем структуру веб-страницы, так и с помощью тегов svg мы управляем тем из каких графических примитивов будет составлено изображение. Например, следующий пример, я любезно позаимствовал с сайта wikipedia (текст примера вполне читаем, если выделить в нем ключевые слова “circle” – круг, “fill” – заливка и т.д.):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<svg version = "1.1"
baseProfile="full"
xmlns = "http://www.w3.org/2000/svg"
xmlns:xlink = "http://www.w3.org/1999/xlink"
xmlns:ev = "http://www.w3.org/2001/xml-events"
height = "400px" width = "400px">
<rect x="0" y="0" width="400" height="400"
fill="none" stroke="black" stroke-width="5px" stroke-opacity="0.5"/>
<g fill-opacity="0.7" stroke="black" stroke-width="0.5px">
<circle cx="200px" cy="200px" r="100px" fill="red" transform="translate( 0,-50)" />
<circle cx="200px" cy="200px" r="100px" fill="blue" transform="translate( 70, 50)" />
<circle cx="200px" cy="200px" r="100px" fill="green" transform="translate(-70, 50)" />
</g>
</svg>
Итак, первая библиотека, о которой мы поговорим сегодня, – это Flot (домашний сайт проекта http://code.google.com/p/flot/). Для того, чтобы вы сразу составили представление о том, что умеет делать flot, прошу посмотреть примеры использования flot по следующему адресу http://code.google.com/p/flot/wiki/FlotUsage Flot построен на базе другой известной javascript библиотеки jquery. В то время как jquery представляет собой набор универсальных функций для манипулирования DOM-деревом html-страницы, то flot специализируется именно на создании диаграмм с помощью canvas и vml. В арсенале flot есть поддержка построения графиков с произвольным количеством серий данных. И каждая серия может быть либо в виде линии, либо в виде столбца. Причем возможно совмещение на одной диаграмме нескольких видов отображения серий данных одновременно, равно как вы можете на одной диаграмме показать две оси OX или OY. Каждая из серий может иметь оформлена в виде обычной линии с маркерами или без, вы можете залить в определенный цвет площадь, занимаемую линей диаграммы, можно даже задать график в виде набора точек не связанных линией между собой. Давайте рассмотрим на примерах описанные выше возможности flot. Начнем мы с того, что распакуем скачанный с сайта http://code.google.com/p/flot/ архив с flot и рассмотрим его содержимое. В поставку входит библиотека jquery (версия 1.2.3, но я успешно использовал flot вместе с последней на момент написания статьи версией jquery 1.3.2). Далее в архиве находится сама библиотека jquery.flot.js (в сжатом виде занимая всего 30 килобайт), затем идет excanvas.js (размер 13 кб.). Последняя библиотека содержит код имитации canvas для браузера internet explorer c помощью VML. Для того, чтобы для пользователей opera или firefox не подключать библиотеку extcanvas.js, то рекомендуется использовать условный комментарий, срабатывающий только для internet explorer:
<html>
<head>
<!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.pack.js"></script><![endif]-->
<script language="javascript" type="text/javascript" src="jquery.js"></script>
<script language="javascript" type="text/javascript" src="jquery.flot.js"></script>
</head>
<body>
<div id="placeholder" style="width:640px; height:480px;"></div>
</body>
</html>
// привязываем функцию doFlot к событию “html-страница” загружена
$(document).ready(doFlot);
// и сама функция построения диаграммы
function doFlot (){
var seriesSin = [];
var seriesCos = [];
var seriesX2 = [];
// формируем массивы с данными
for (var x = -Math.PI/2; x <= Math.PI/2; x+=0.1){
seriesSin.push ([x, Math.sin(x)]);
seriesCos.push ([x, Math.cos(x)]);
seriesX2.push ([x, x*x]);
}
var chartConfig = {
xaxis: {},
legend: {},
yaxis: {},
x2axis: {},
y2axis: {},
points: {},
lines: {},
bars: {},
grid: {},
selection: {},
shadowSize: 4,
colors: []
};
// и строим саму диагрумму
$.plot($("#placeholder"),
[
{ data: seriesSin, label: "sin (x)" },
{ data: seriesCos, label: "cos (x)" },
{ data: seriesX2, label: "x^2" }
],
chartConfig);
};
Очень часто диаграммы показывают зависимость изменения во времени некоторой величин. В этом случае мало указывать массив исходных данных так (в пример я хочу показать значения прибыли некоторой организации за полтора года):
var seriesProrofit = [];
var i = 0;
for (var i = 0; i < 18; i++)
seriesProrofit.push ( [new Date (2005, i, 1), 100+Math.tan(i/2)*i ]);
var chartConfig = {
xaxis: {mode: “time” },
// и все как обычно …
}
var chartConfig = {
xaxis: {mode: "time",
monthNames:
[
"январь", "февраль", "март", "апрель", "май", "июнь",
"июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"
],
timeformat: "%d %b %y",
ticks: 5
},
// и все как обычно
}
« Управление сборкой проектов вместе с teamcity. Часть 3 | Графики и диаграммы на веб-страницах. Часть 2 » |