Интерактивная инфографика — это визуализация данных, реагирующая на действия пользователя: наведение, клики, перетаскивание, изменение параметров. Библиотека Paper.js предоставляет удобный API для работы с векторной графикой, что делает её особенно подходящей для подобных задач.
Ключевая идея — связывание графических объектов (Path, Shape, Group) с данными и обработчиками событий.
Каждый элемент инфографики должен представлять данные. В Paper.js это достигается через пользовательские свойства:
var circle = new Path.Circle({
center: [100, 100],
radius: 30,
fillColor: 'blue'
});
circle.data.value = 42;
circle.data.label = 'Показатель A';
Объект data позволяет хранить любые метаданные,
связанные с визуальным элементом.
Интерактивность реализуется через события мыши:
circle.onMouseEn ter = function(event) {
this.fillColor = 'red';
};
circle.onMouseLe ave = function(event) {
this.fillColor = 'blue';
};
circle.onCl ick = function(event) {
console.log(this.data.label + ': ' + this.data.value);
};
Поддерживаемые события:
onMouseEnteronMouseLeaveonMouseMoveonClickonMouseDragСоздание простой интерактивной диаграммы:
var data = [50, 80, 30, 60];
var bars = [];
for (var i = 0; i < data.length; i++) {
var height = data[i];
var rect = new Path.Rectangle({
point: [i * 60, 200 - height],
size: [40, height],
fillColor: 'green'
});
rect.data.value = height;
rect.onMouseEn ter = function() {
this.fillColor = 'orange';
};
rect.onMouseLe ave = function() {
this.fillColor = 'green';
};
bars.push(rect);
}
Каждый столбец хранит своё значение и реагирует на наведение.
Для отображения информации при наведении используется текст:
var tooltip = new PointText({
point: [0, 0],
content: '',
fillColor: 'black',
visible: false
});
rect.onMouseEn ter = function(event) {
tooltip.content = this.data.value;
tooltip.position = event.point + [10, -10];
tooltip.visible = true;
};
rect.onMouseLe ave = function() {
tooltip.visible = false;
};
Важно обновлять позицию tooltip при движении мыши:
rect.onMouseM ove = function(event) {
tooltip.position = event.point + [10, -10];
};
Анимация усиливает восприятие информации. В Paper.js используется
глобальный обработчик onFrame:
view.onFr ame = function(event) {
bars.forEach(function(bar) {
var targetHeight = bar.data.value;
var currentHeight = bar.bounds.height;
var delta = (targetHeight - currentHeight) * 0.1;
bar.scale(1, (currentHeight + delta) / currentHeight, bar.bounds.bottomCenter);
});
};
Так достигается плавное «рост» столбцов.
Сложные инфографики состоят из множества элементов. Группы позволяют управлять ими как единым объектом:
var group = new Group(bars);
group.onMouseEn ter = function() {
this.opacity = 0.7;
};
group.onMouseLe ave = function() {
this.opacity = 1;
};
Группировка упрощает трансформации и обработку событий.
Для поддержки разных размеров экрана используется масштабирование
view:
view.onRes ize = function(event) {
var scale = view.size.width / 800;
project.activeLayer.scale(scale, view.center);
};
Адаптивность особенно важна для веб-инфографики.
Paper.js поддерживает кривые Безье, что полезно для визуализации трендов:
var path = new Path({
strokeColor: 'blue',
strokeWidth: 2
});
path.add(new Point(0, 100));
path.cubicCurveTo(
new Point(100, 50),
new Point(200, 150),
new Point(300, 100)
);
Такие линии могут представлять динамику данных.
Инфографика может реагировать на ввод:
function updateData(newData) {
bars.forEach(function(bar, index) {
bar.data.value = newData[index];
});
}
После изменения значений анимация автоматически обновит визуализацию.
Реализация drag-and-drop:
circle.onMouseD rag = function(event) {
this.position += event.delta;
};
Используется в интерактивных схемах и редакторах.
Разделение элементов по слоям:
var backgroundLayer = new Layer();
var dataLayer = new Layer();
var uiLayer = new Layer();
uiLayer.activate();
Преимущества:
При работе с большим количеством элементов:
Raster для статических частейproject.activeLayer.removeChildren();
Удаление ненужных объектов освобождает ресурсы.
Пример фильтрации:
function filter(threshold) {
bars.forEach(function(bar) {
bar.visible = bar.data.value >= threshold;
});
}
Добавление UI-элементов (слайдеров) позволяет управлять отображением.
Несколько типов графиков в одном проекте:
Каждый тип реализуется через соответствующие примитивы Paper.js, объединённые в общую систему координат.
Цвета несут смысловую нагрузку:
rect.fillColor = {
gradient: {
stops: ['green', 'yellow', 'red']
},
origin: rect.bounds.topCenter,
destination: rect.bounds.bottomCenter
};
Градиенты помогают визуально кодировать значения.
Переход к деталям:
rect.onCl ick = function() {
showDetails(this.data);
};
Функция может отображать дополнительные графики или текст.
Инфографика может обновляться из API:
fetch('/data.json')
.then(response => response.json())
.then(data => updateData(data));
Важно учитывать асинхронность и перерисовку.
Типичная структура:
Разделение ответственности повышает масштабируемость.
Paper.js можно комбинировать с:
Это позволяет создавать сложные аналитические панели.
Векторная природа Paper.js обеспечивает высокое качество отображения и гибкость взаимодействия.