Канал strokeDash отвечает за управление пунктирной
(штриховой) структурой линии в графических примитивах. Он определяет
последовательность длин сегментов «линия–пробел», задавая визуальный
ритм контура геометрических объектов. В терминах грамматики визуализации
Vega и Vega-Lite этот канал относится к визуальным encoding channels и
применяется для масштабируемого управления стилем линий в зависимости от
данных.
strokeDash задаётся как массив чисел:
strokeDash: [dashLength, gapLength, dashLength, gapLength, ...]
Каждое значение интерпретируется как длина сегмента в пикселях (или в координатах сцены после трансформаций масштаба). Последовательность повторяется циклически вдоль всей линии.
Базовые свойства:
В Vega strokeDash используется внутри описания
marks:
{
"type": "line",
"encode": {
"update": {
"stroke": { "value": "steelblue" },
"strokeWidth": { "value": 2 },
"strokeDash": { "value": [6, 3] }
}
}
}
Здесь линия рисуется с повторяющимся паттерном:
strokeDash может быть связан с полями данных:
"strokeDash": {
"field": "dashPattern"
}
Где dashPattern может содержать массивы:
[
{ "category": "A", "dashPattern": [1, 0] },
{ "category": "B", "dashPattern": [5, 2] },
{ "category": "C", "dashPattern": [10, 4] }
]
Это позволяет кодировать категориальные различия не цветом, а структурой линии.
В Vega-Lite strokeDash применяется в секции
encoding.
{
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" },
"strokeDash": { "field": "category", "type": "nominal" }
}
}
Однако прямое использование категориального поля требует
трансформации через scale или condition,
поскольку strokeDash ожидает числовой массив.
Типичный подход — явное сопоставление значений:
"strokeDash": {
"condition": [
{ "test": "datum.category === 'A'", "value": [1, 0] },
{ "test": "datum.category === 'B'", "value": [6, 2] },
{ "test": "datum.category === 'C'", "value": [2, 2] }
],
"value": [0]
}
Такой механизм позволяет реализовать визуальную дифференциацию без дополнительных каналов (например, цвета или толщины).
strokeDash часто используется вместе с другими
каналами:
Толщина линии усиливает или ослабляет восприятие паттерна:
"strokeWidth": { "value": 3 },
"strokeDash": { "value": [8, 4] }
Толстые линии с длинными штрихами читаются стабильнее на сложных графиках.
Прозрачность влияет на визуальную «плотность» паттерна:
"strokeOpacity": { "value": 0.6 },
"strokeDash": { "value": [4, 2] }
Механизм strokeDash реализуется как параметризация кривой по длине дуги:
Формально:
pattern(t) = dashArray[t mod sum(dashArray)]
Где чередование определяется суммой элементов массива.
В Vega возможно управление через signals:
"signals": [
{
"name": "dash",
"value": [4, 2]
}
]
И применение:
"strokeDash": { "signal": "dash" }
Это позволяет динамически изменять стиль линии без перерасчёта данных.
[]
или отсутствие свойства.
[5, 5]
[12, 6]
[2, 2, 8, 2]
[1, 1]
При визуализации нескольких линий strokeDash заменяет
или дополняет цветовое кодирование:
"encoding": {
"color": { "field": "series" },
"strokeDash": { "field": "series" }
}
Такой подход особенно важен при:
При применении scale, zoom и pan:
В сложных визуализациях strokeDash комбинируется с:
interpolate (тип линии)curve (сглаживание)defined (разрыв линии по условию)fill (для замкнутых контуров)Это позволяет формировать гибридные визуальные коды, где форма линии несёт дополнительную информационную нагрузку.
strokeDash относится к ретинальным каналам
восприятия, влияющим на:
В отличие от цвета, он сохраняет различимость при печати и в условиях ограниченного дисплея, но требует большей внимательности к плотности паттерна и масштабу отображения.