В SVG-спецификации элемент defs выполняет роль
контейнера для объектов, которые не должны напрямую отображаться на
странице, но используются повторно через ссылки. Визуальные примитивы,
градиенты, паттерны, символы и фильтры часто определяются внутри
defs, после чего применяются через id.
Ключевая особенность:
defs не участвует в рендерингеurl(#id)В контексте D3.js работа с defs строится программно,
через создание SVG-элементов:
const svg = d3.select("svg");
const defs = svg.append("defs");
После этого внутри defs размещаются паттерны, символы
или фильтры, которые затем используются в визуализации.
symbol в D3.jsГенератор d3.symbol предназначен для создания SVG-путей,
представляющих геометрические маркеры. Он применяется в диаграммах
рассеяния, точечных графиках и любых визуализациях, где требуется
унифицированное обозначение категорий.
Базовый принцип:
d3.symbol() возвращает генератор путиtype задаёт формуsize определяет площадь фигурыconst symbol = d3.symbol()
.type(d3.symbolCircle)
.size(64);
Применение в связке с данными:
svg.selectAll("path")
.data(data)
.enter()
.append("path")
.attr("d", d3.symbol().type(d => d.type).size(100))
.attr("transform", d => `translate(${d.x}, ${d.y})`);
Каждый элемент данных может задавать тип символа, обеспечивая категориальное кодирование.
D3 предоставляет фиксированный набор базовых форм, реализованных как константы:
d3.symbolCircled3.symbolSquared3.symbolDiamondd3.symbolTriangled3.symbolCrossd3.symbolStard3.symbolWyeКаждая форма представляет собой параметризованный алгоритм генерации SVG path.
Особенность работы:
dsize,
а не от transform: scalesizeПараметр size в d3.symbol задаёт площадь
фигуры в квадратных пикселях, а не линейный размер.
d3.symbol().type(d3.symbolStar).size(200);
При увеличении size форма сохраняет пропорции, изменяя
только масштаб.
Практическая особенность:
Типичная схема использования символов в графиках:
svg.selectAll("path.symbol")
.data(dataset)
.enter()
.append("path")
.attr("class", "symbol")
.attr("d", d => symbol.type(d.category)())
.attr("transform", d => `translate(${x(d.x)}, ${y(d.y)})`);
Здесь:
category определяет формуx и yВизуальная кодировка достигается без изменения структуры DOM.
pattern как
система заливкиЭлемент <pattern> определяет повторяющийся
фрагмент, используемый как заливка или обводка. Он размещается внутри
defs и применяется через
fill: url(#patternId).
Базовая структура:
const defs = svg.append("defs");
defs.append("pattern")
.attr("id", "diagonalHatch")
.attr("width", 6)
.attr("height", 6)
.attr("patternUnits", "userSpaceOnUse")
.append("path")
.attr("d", "M0,6 L6,0")
.attr("stroke", "black");
Применение:
svg.append("rect")
.attr("width", 200)
.attr("height", 200)
.attr("fill", "url(#diagonalHatch)");
patternUnits определяет систему координат:
userSpaceOnUse — абсолютные координаты SVGobjectBoundingBox — относительные координаты 0..1При использовании objectBoundingBox паттерн
масштабируется под объект:
.attr("patternUnits", "objectBoundingBox")
Дополнительный контроль даёт patternTransform,
позволяющий вращать и масштабировать узор:
.attr("patternTransform", "rotate(45)")
D3 позволяет программно создавать сложные текстуры на основе данных или параметров визуализации.
Пример точечного паттерна:
const pattern = defs.append("pattern")
.attr("id", "dots")
.attr("width", 10)
.attr("height", 10)
.attr("patternUnits", "userSpaceOnUse");
pattern.append("circle")
.attr("cx", 3)
.attr("cy", 3)
.attr("r", 1.5);
Такие конструкции используются для:
symbol и patternВизуальные системы часто объединяют символы и паттерны для усиления кодирования данных.
Сценарии:
Пример наложения:
svg.append("rect")
.attr("fill", "url(#dots)");
svg.append("path")
.attr("d", d3.symbol().type(d3.symbolTriangle).size(80))
.attr("transform", "translate(50,50)");
В сложных диаграммах паттерны используются для различения элементов без зависимости от цветового канала:
Преимущество:
defsРабота с defs и повторяющимися элементами требует учёта
DOM-структуры:
pattern увеличивает SVG-деревоsymbol генерирует path на каждый элемент данныхОптимизация достигается через:
idd3.symbolКомбинация defs, symbol и
pattern формирует основу расширяемых визуализаций:
defs хранит все переиспользуемые сущностиsymbol обеспечивает компактные маркеры данныхpattern формирует текстурные слои и заливкиТакая архитектура позволяет отделять геометрию от данных и управлять визуальной сложностью через декларативные конструкции SVG и D3.js.