В Vega и Vega-Lite визуальные свойства графических примитивов управляются через систему каналов кодирования (encoding channels), среди которых цвет занимает особое место. Два базовых канала, определяющих цветовую заливку и обводку геометрии, — fill и stroke — используются для управления внешним видом маркеров, областей, линий и сложных графических элементов.
Канал fill задаёт цвет внутреннего пространства графического объекта. Он применяется к фигурам, обладающим площадью:
circle)rect)area)geoshape)symbol, в зависимости от режима)Основная характеристика fill — заполнение замкнутой области:
{
"mark": "rect",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"},
"color": {"field": "category", "type": "nominal"}
}
}
В Vega-Lite канал color по умолчанию маппится в
fill для большинства заливочных марок.
Канал stroke управляет цветом линии контура объекта. Он применяется к:
line)rect, circle,
geoshape)point, symbol)path){
"mark": {
"type": "line",
"strokeWidth": 2
},
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": "value", "type": "quantitative"},
"color": {"field": "series", "type": "nominal"}
}
}
В линейных графиках stroke является основным визуальным
носителем цвета.
В Vega-Lite канал color является абстрактным уровнем,
который автоматически транслируется в:
fill — для заливочных марокstroke — для линейных и контурных марок| Тип марки | Используемый канал |
|---|---|
| rect | fill |
| area | fill |
| bar | fill |
| circle | fill |
| point | fill + stroke (в зависимости от config) |
| line | stroke |
Vega позволяет задавать fill и stroke
независимо, что критично при построении сложных визуализаций.
{
"mark": {
"type": "circle",
"fill": "steelblue",
"stroke": "black",
"strokeWidth": 1
},
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"}
}
}
Такое разделение позволяет:
Если одновременно заданы:
mark.fillencoding.colorприоритет зависит от типа маппинга:
encoding.color → применяется динамическое
значениеПример конфликта:
{
"mark": {
"type": "bar",
"fill": "red"
},
"encoding": {
"color": {"field": "group", "type": "nominal"}
}
}
Здесь fill: red игнорируется, так как color
переопределяет визуальное свойство.
Внутренне Vega-Lite компилирует color в Vega-spec:
"fill": {"scale": ..., "field": ...}
"stroke": {"scale": ..., "field": ...}
Это разделение особенно важно при кастомизации Vega напрямую.
Каналы fill и stroke почти всегда связаны с цветовой шкалой (scale).
"color": {
"field": "category",
"type": "nominal",
"scale": {
"scheme": "category10"
}
}
"color": {
"field": "value",
"type": "quantitative",
"scale": {
"scheme": "blues"
}
}
"color": {
"field": "date",
"type": "temporal"
}
При многослойной визуализации fill и stroke используются для разделения смысловых уровней.
{
"layer": [
{
"mark": {"type": "area", "opacity": 0.3},
"encoding": {
"x": {"field": "x"},
"y": {"field": "y1"},
"y2": {"field": "y2"},
"color": {"value": "lightblue"}
}
},
{
"mark": {
"type": "line",
"strokeWidth": 2
},
"encoding": {
"x": {"field": "x"},
"y": {"field": "y1"},
"color": {"value": "blue"}
}
}
]
}
Здесь:
Каналы fill и stroke часто комбинируются с:
opacityfillOpacitystrokeOpacity"mark": {
"type": "point",
"fillOpacity": 0.7,
"strokeOpacity": 1,
"strokeWidth": 2
}
Марки point и symbol могут использовать
одновременно fill и stroke:
{
"mark": "point",
"encoding": {
"color": {"field": "group"}
},
"config": {
"point": {
"filled": true,
"strokeWidth": 1
}
}
}
При filled: false fill отключается полностью, остаётся
только stroke.
Если значение цвета отсутствует:
null → default colorconfig"config": {
"mark": {
"color": "#999"
}
}
fill/stroke ведут себя независимо:
Глобальные настройки влияют на fill/stroke:
"config": {
"mark": {
"fill": "steelblue",
"stroke": "black"
}
}
Это позволяет задавать базовый стиль для всех визуализаций без дублирования encoding.