Опубликован: 29.08.2012 | Уровень: специалист | Доступ: платный
Практическая работа 5:

Визуализации данных с помощью библиотекиJIT. Знакомство с JavaScript Object Notation (JSON)

< Практическая работа 4 || Практическая работа 5 || Лекция 4 >
Аннотация: На этом занятии мы познакомимся со способами создания диаграмм с помощью библиотеки JIT.

Примеры

На предыдущих практических занятиях для построения графиков мы использовали библиотеки jsapi.js и jQuery. В предлагаемой работе мы воспользуемся библиотекой jit, разработанной NicolasGarciaBelmonteиз SenchaInc. Для этого нам потребуется скачать пример с сайта http://philogb.github.com/. В файле index.html замените содержимое на следующий код:

index.html

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en"lang="en">
<head>
<metahttp-equiv="Content-Type"content="text/html"; charset="Windows-1251"/>
<title>Образец графика с областями</title>

<!-- CSS Files -->
<linktype="text/css"href="base.css"rel="stylesheet"/>
<linktype="text/css"href="AreaChart.css"rel="stylesheet"/>

<!--[if IE]><script language="javascript" type="text/javascript" src="../../Extras/excanvas.js"></script><![endif]-->

<!-- JIT Library File -->
<scriptlanguage="javascript"type="text/javascript"src="jit.js"></script>

<!-- Example File -->
<scriptlanguage="javascript"type="text/javascript"src="example1.js"></script>
</head>

<bodyonload="init();">
<divid="container">

<divid="left-container">
<divclass="text">
<h4>
            Образец диаграммы с областями    
</h4>
            Образец статической диаграммы, отображающей данные в виде стопок
<br/><br/>
            Нажмите левую кнопку мыши для выбора фильтра
<br/><br/>
            Нажмите правую кнопку для восстановления стопок
<br/><br/>
            Нажмите на кнопку "Обновить" для обновления данных JSON
</div>
<ulid="id-list"></ul>
<aid="update"href="#"class="theme button white">Обновитьданные</a>
<aid="restore"href="#"class="theme button white">Удалитьфильтр</a>




<divstyle="text-align:center;"><ahref="example1.js">Просмотретькод:</a></div>
</div>
<divid="center-container">
<divid="infovis"></div>
</div>
<divid="right-container">

<divid="inner-details"></div>
</div>
<divid="log"></div>
</div>
</body>
</html>
    

Затем в блокноте создайте следующий скрипт:

myScript.js

varlabelType, useGradients, nativeTextSupport, animate;

(function () {
varua = navigator.userAgent,
iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
typeOfCanvas = typeofHTMLCanvasElement,
nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'),
textSupport = nativeCanvasSupport
&& (typeofdocument.createElement('canvas').getContext('2d').fillText == 'function');
//I'm setting this based on the fact that ExCanvas provides text support for IE
//and that as of today iPhone/iPad current text support is lame
labelType = (!nativeCanvasSupport || (textSupport&& !iStuff)) ? 'Native' : 'HTML';
nativeTextSupport = labelType == 'Native';
useGradients = nativeCanvasSupport;
    animate = !(iStuff || !nativeCanvasSupport);
})();

var Log = {
elem: false,
    write: function (text) {
if (!this.elem)
this.elem = document.getElementById('log');
this.elem.innerHTML = text;
this.elem.style.left = (500 - this.elem.offsetWidth / 2) + 'px';
    }
};


functioninit() {
//init data
varjson = {
'label': ['Вася', 'Петя', 'Марина', 'Ирина'],
'values': [
        {
'label': 'Январь',
'values': [20, 40, 15, 5]
        },
        {
'label': 'Февраль',
'values': [30, 10, 45, 10]
        },
        {
'label': 'Март',
'values': [38, 20, 35, 17]
        },
        {
'label': 'Апрель',
'values': [58, 10, 35, 32]
        },
        {
'label': 'Май',
'values': [55, 60, 34, 38]
        },
        {
'label': 'Июнь',
'values': [26, 40, 25, 40]
        }]

    };
var json2 = {
'values': [
        {
'label': 'Январь',
'values': [10, 40, 15, 7]
        },
        {
'label': 'Февраль',
'values': [30, 40, 45, 9]
        },
        {
'label': 'Май',
'values': [55, 30, 34, 26]
        },
        {
'label': 'Июнь',
'values': [26, 40, 85, 28]
        }]

    };
//end
varinfovis = document.getElementById('infovis');
//initAreaChart
varareaChart = new $jit.AreaChart({
//id of the visualization container
injectInto: 'infovis',
//add animations
        animate: true,
//separation offsets
        Margin: {
            top: 5,
            left: 5,
            right: 5,
            bottom: 5
        },
labelOffset: 10,
//whether to display sums
showAggregates: true,
//whether to display labels at all
showLabels: true,
//could also be 'stacked'
        type: useGradients ? 'stacked:gradient' : 'stacked',
//label styling
        Label: {
            type: labelType, //can be 'Native' or 'HTML'
            size: 13,
            family: 'Arial',
            color: 'white'
        },
//enable tips
        Tips: {
            enable: true,
onShow: function (tip, elem) {
tip.innerHTML = "<b>" + elem.name + "</b>: " + elem.value;
            }
        },
//add left and right click handlers
filterOnClick: true,
restoreOnRightClick: true
    });
//load JSON data.
areaChart.loadJSON(json);
//end
var list = $jit.id('id-list'),
        button = $jit.id('update'),
restoreButton = $jit.id('restore');
//update json on click
    $jit.util.addEvent(button, 'click', function () {
varutil = $jit.util;
if (util.hasClass(button, 'gray')) return;
util.removeClass(button, 'white');
util.addClass(button, 'gray');
areaChart.updateJSON(json2);
    });
//restore graph on click
    $jit.util.addEvent(restoreButton, 'click', function () {
areaChart.restore();
    });
//dynamically add legend to list
var legend = areaChart.getLegend(),
listItems = [];
for (var name in legend) {
listItems.push('<div class=\'query-color\' style=\'background-color:'
          + legend[name] + '\'>&nbsp;</div>' + name);
    }
list.innerHTML = '<li>' + listItems.join('</li><li>') + '</li>';
}
    

Файлы AreaChart.css, base.cssиjit.js можно использовать без изменения. Хотелось бы обратить ваше внимание на способ представления данных для графиков:

varjson = {
'label': ['Вася', 'Петя', 'Марина', 'Ирина'],
'values': [
        {
'label': 'Январь',
'values': [20, 40, 15, 5]
        },
        {
'label': 'Февраль',
'values': [30, 10, 45, 10]
        },
        {
'label': 'Март',
'values': [38, 20, 35, 17]
        },
        {
'label': 'Апрель',
'values': [58, 10, 35, 32]
        },
        {
'label': 'Май',
'values': [55, 60, 34, 38]
        },
        {
'label': 'Июнь',
'values': [26, 40, 25, 40]
        }]

    };
var json2 = {
'values': [
        {
'label': 'Январь',
'values': [10, 40, 15, 7]
        },
        {
'label': 'Февраль',
'values': [30, 40, 45, 9]
        },
        {
'label': 'Май',
'values': [55, 30, 34, 26]
        },
        {
'label': 'Июнь',
'values': [26, 40, 85, 28]
        }]
    

Здесь мы имеем дело с JavaScript Object Notation (JSON). JSON хорошо подходит для описания сложных структур данных. JSON содержит наборы пар ключ/значение. В нашем случае, например, ключу 'Январь' соответствуют значения: [20, 40, 15, 5].

Результат:

Разработайте собственный пример построения диаграмм.

< Практическая работа 4 || Практическая работа 5 || Лекция 4 >
Александр Лобанов
Александр Лобанов

Даю задания для студентов. Они хотят повторно пройти курс. Как отписаться от выполненного курса, что бы пройти его заново?

Анна Королева
Анна Королева
Беларусь, Минск, Беларуский Государственный Университет Информатики и Радиоэлектроники, 1998
Аббас Гусенов
Аббас Гусенов
Казахстан, Алматы, Казахский национальный технический университет имени К.И. Сатпаева, 2013