JavaScript. Несложное создание гистограмм

Учитывая, что сейчас многие пользуются блого-сервисами (blogger, tumblr, livejournal, etc.), могут возникнуть потребности в создании гистограмм. Мы же любим, когда данные можно "потрогать". Использование PHP в этом случае затруднено. Поэтому самый простой способ - создание гистограмм на JavaScripte с помощью CSS-стилей. Сразу отмечу, что сие способ описан в руководстве Флэнагана по JavaScript (со своими изменениями).
Основную работу будет выполнять js-файл - BarChart.js (см. листинг ниже). На входе он ожидает данные в виде массива, значения которого он аккуратно заклыдывает в гистограмму, которую выдает на выходе. Все очень просто. Ниже представлен один из примеров гистаграммы (Test chart).
Получаемые гистограммы легко инсталлируются в веб-странички. При этом можно входные данные сделать динамичными, так сказать - поставить на поток, что должно сделать динамичным и саму гистограмму. Ниже представлены листинги индексной html-странички и BarChart.js.
 
index.html
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!-- Без объявления DOCTYPE в IE рисунок будет выглядеть неправильно -->
<html>
<head>
<script src="BarChart.js"></script> <!-- Подключить библиотеку -->
<script>
function drawChart() {
var data = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,50,50,50,5,5,5,5,5,5,5,5,50,6,6,7,7,7,60,8];
var chart = makeBarChart(data, 300, 300);
var container = document.getElementById("chartContainer");
container.appendChild(chart);
}
</script>
</head>
<body onload="drawChart( )">
<h2>Test chart</h2><!-- Заголовок гистограммы -->
<div id="chartContainer"><!-- Здесь рисуется гистограмма --></div>
<!-- Подпись под гистограммой -->
<i>Test chart</i>
</body>
</html>
 
BarChart.js
 
 /**
* BarChart.js:
* В этом файле содержится определение функции makeBarChart(), которая
* создает гистограмму для вывода содержимого массива data[].
* Общий размер гистограммы определяется необязательными аргументами
* width и height, которые учитывают пространство, необходимое для рамок
* гистограммы и внутренних отступов. Необязательный аргумент barcolor
* определяет цвет столбиков. Функция возвращает созданный ею элемент
* <div>, таким образом, вызывающий сценарий может манипулировать
* этим элементом, например, изменять величину отступов. Вызывающий
* сценарий должен вставить в документ полученный от функции элемент,
* чтобы сделать его видимым.
**/
function makeBarChart(data, width, height, barcolor) {
 // Предусмотреть значения по умолчанию для необязательных аргументов
 if (!width) width = 500;
 if (!height) height = 350;
 if (!barcolor) barcolor = "blue";
 // Аргументы width и height определяют общий размер гистограммы.
 // Чтобы получить размер создаваемого элемента, необходимо вычесть
 // из этих значений толщину рамок и величину отступов.
 width -= 24; // Вычесть 10px отступа и 2px толщины рамки слева и справа
 height -= 14; // Вычесть 10px отступа сверху и 2px толщины рамки сверху и снизу
 // Создать элемент для размещения гистограммы. Обратите внимание:
 // гистограмма позиционируется в относительных координатах, т. е.
 // в ней могут располагаться дочерние элементы с абсолютным
 // позиционированием, и отображаться при этом в нормальном потоке
 // вывода элементов документа.
 var chart = document.createElement("div");
 chart.style.position = "relative"; // Относительное позиционирование
 chart.style.width = width + "px"; // Ширина гистограммы
 chart.style.height = height + "px"; // Высота гистограммы
 chart.style.border = "solid black 1px"; // Определить рамку
 chart.style.paddingLeft = "10px"; // Добавить отступ слева
 chart.style.paddingRight = "10px"; // Справа
 chart.style.paddingTop = "10px"; // Сверху
 chart.style.paddingBottom = "0px"; // Но не снизу
 chart.style.backgroundColor = "white"; // Фон гистограммы - белый
 // Рассчитать ширину каждого столбика

 //var barwidth = Math.floor(width/data.length);
 var barwidth = 1;

 // Отыскать наибольшее число в массиве data[]. Обратите внимание
 // на грамотное использование функции Function.apply().
 var maxdata = Math.max.apply(this, data);
 // Масштабирующий множитель: scale*data[i] дает высоту столбика
 var scale = height/maxdata;
 // Обойти в цикле массив с данными и создать столбики для всех элементов
 for(var i = 0; i < data.length; i++) {
  var bar = document.createElement("div"); // Создать столбик
  var barheight = data[i] * scale; // Рассчитать высоту
  bar.style.position = "absolute"; // Уст. размер и положение
  bar.style.left = (barwidth*i+1+10)+"px"; // Добавить рамку столбика
  // и отступ
  bar.style.top = height-barheight+10+"px";// Добавить отступ
  // гистограммы
  bar.style.width = (barwidth-2) + "px"; // -2 - рамка столбика
  bar.style.height = (barheight-1) + "px"; // -1 - рамка сверху
  if (data[i] >= 50) bar.style.border = "solid red 1px"; // Стиль рамки столбика при значениях более 50
  if (data[i] < 50) bar.style.border = "solid blue 1px"; // Стиль рамки столбика при значениях менее 50
  bar.style.backgroundColor = barcolor; // Цвет столбика
  bar.style.fontSize = "0px"; // Учесть особенность IE
  chart.appendChild(bar); // Добавить столбик
  // в гистограмму
 }
 // В заключение вернуть элемент с гистограммой
 return chart;
}


Все представленные листинги можно скачать здесь. Всем удачи.