Библиотека Snap.svg предоставляет мощные средства для работы с векторной графикой в браузере, включая создание и управление линейными графиками. Линейный график представляет собой последовательность точек, соединённых линиями, отображающих изменения значений во времени или зависимости одной переменной от другой.
Для построения линейного графика в Snap.svg используются базовые
элементы <svg>,
path, а также методы библиотеки для
создания и анимации линий.
Первым шагом является создание SVG-контейнера, на котором будет отображаться график:
var s = Snap(800, 400); // создаём канву 800x400 пикселей
Здесь Snap(ширина, высота) создаёт элемент
<svg> указанного размера и помещает его в тело
документа. Все графические элементы графика будут добавляться на эту
канву.
<path>Линейный график строится с помощью элемента path,
который описывает последовательность координат и соединяет их линиями.
Основные команды пути в Snap.svg:
M x y — переместиться в точку (x, y) без
рисования линииL x y — провести линию к точке (x, y)C x1 y1, x2 y2, x y — кривая Безье третьего
порядкаПример создания простого линейного графика:
var linePath = "M 50 350 L 150 200 L 250 300 L 350 150 L 450 250";
var line = s.path(linePath).attr({
stroke: "#1E90FF",
strokeWidth: 2,
fill: "none"
});
stroke задаёт цвет линии.strokeWidth — толщину линии.fill: none отключает заливку, так как график состоит
только из линии.Для динамических графиков удобно строить линию из массива чисел:
var data = [300, 250, 320, 180, 260, 200];
var pathStr = "M 50 " + (400 - data[0]);
for (var i = 1; i < data.length; i++) {
pathStr += " L " + (50 + i * 100) + " " + (400 - data[i]);
}
var line = s.path(pathStr).attr({
stroke: "#FF4500",
strokeWidth: 3,
fill: "none"
});
y перевернута (400 - data[i]),
чтобы линии шли снизу вверх, как в традиционных графиках.i * 100).Для визуализации отдельных данных удобно добавить кружки в местах координат точек:
data.forEach(function(value, i) {
s.circle(50 + i * 100, 400 - value, 5).attr({
fill: "#FF6347",
stroke: "#000",
strokeWidth: 1
});
});
s.circle(x, y, r) создаёт кружок с радиусом
r.fill задаёт цвет заливки точки.stroke и strokeWidth создают обводку.Snap.svg позволяет анимировать графики, например, постепенное
появление линии. Для этого используется метод
animate():
var totalLength = line.getTotalLength();
line.attr({
strokeDasharray: totalLength,
strokeDashoffset: totalLength
});
line.animate({ strokeDashoffset: 0 }, 2000, mina.easeinout);
getTotalLength() вычисляет длину линии.strokeDasharray и strokeDashoffset
позволяют создавать эффект “рисования линии”.animate() постепенно изменяет свойства за указанное
время (в данном случае 2000 мс).Для графиков важно добавить координатные оси и сетку:
// Горизонтальная ось
s.line(50, 400, 650, 400).attr({ stroke: "#000", strokeWidth: 2 });
// Вертикальная ось
s.line(50, 50, 50, 400).attr({ stroke: "#000", strokeWidth: 2 });
// Горизонтальная сетка
for (var y = 100; y < 400; y += 50) {
s.line(50, y, 650, y).attr({ stroke: "#ccc", strokeWidth: 1 });
}
// Вертикальная сетка
for (var x = 150; x <= 650; x += 100) {
s.line(x, 50, x, 400).attr({ stroke: "#ccc", strokeWidth: 1 });
}
Для интерактивных графиков линии можно обновлять без перерисовки всего SVG:
function updateGraph(newData) {
var newPath = "M 50 " + (400 - newData[0]);
for (var i = 1; i < newData.length; i++) {
newPath += " L " + (50 + i * 100) + " " + (400 - newData[i]);
}
line.animate({ d: newPath }, 1000, mina.easeinout);
}
animate({ d: newPath }) плавно изменяет путь
линии на новые координаты.Snap.svg предоставляет множество атрибутов для стилизации графика:
stroke-linecap: round | square | butt — форма концов
линииstroke-linejoin: round | bevel | miter — форма
соединенийstroke-dasharray — пунктирная линияopacity — прозрачность линииПример с пунктирной линией и мягкими концами:
line.attr({
stroke: "#32CD32",
strokeWidth: 4,
strokeDasharray: "10,5",
strokeLinecap: "round",
strokeLinejoin: "round"
});
Для сравнения разных наборов данных на одном графике можно добавить несколько линий:
var data2 = [180, 220, 260, 200, 300, 240];
var path2 = "M 50 " + (400 - data2[0]);
for (var i = 1; i < data2.length; i++) {
path2 += " L " + (50 + i * 100) + " " + (400 - data2[i]);
}
s.path(path2).attr({
stroke: "#1E90FF",
strokeWidth: 2,
fill: "none"
});
Этот подход позволяет строить полностью интерактивные, динамические линейные графики в Snap.svg с высокой степенью кастомизации и визуальной выразительности, используя мощь методов работы с путями, анимациями и атрибутами SVG.