Тепловые карты плотности
Решётчатая диаграмма оценок плотности для характеристик автомобилей, разделённых по региону происхождения. Сетки плотности, полученные преобразованием kde2d, превращаются в изображения преобразованием heatmap. По умолчанию каждая тепловая карта нормируется отдельно. Если resolve равно "shared", плотность вероятности или количества нормируется по общему максимуму всех графиков. Здесь тепловые карты выводятся примитивами image. В другом примере тепловой карты используется сетка примитивов rect.
Спецификация Vega в JSON <>
{
"$schema": "https://vega.github.io/schema/vega/v6.json",
"description": "Серия тепловых карт двумерной плотности автомобильных показателей.",
"width": 250,
"height": 250,
"padding": 5,
"autosize": "pad",
"signals": [
{
"name": "fieldX", "value": "Acceleration",
"bind": {"name": "Показатель по X", "input": "select", "options": ["Acceleration", "Displacement", "Horsepower"], "labels": ["Ускорение", "Рабочий объём двигателя", "Мощность"]}
},
{
"name": "bandwidthX", "value": -1,
"bind": {"name": "Ширина окна по X", "input": "range", "min": -1, "max": 100, "step": 1}
},
{
"name": "bandwidthY", "value": -1,
"bind": {"name": "Ширина окна по Y", "input": "range", "min": -1, "max": 100, "step": 1}
},
{
"name": "resolve", "value": "independent",
"bind": {"name": "Способ расчёта", "input": "select", "options": ["independent", "shared"], "labels": ["Независимо", "Совместно"]}
},
{
"name": "counts", "value": false,
"bind": {"name": "Показывать частоты", "input": "checkbox"}
},
{
"name": "smooth", "value": true,
"bind": {"name": "Сглаживание", "input": "checkbox"}
},
{
"name": "cellSize", "value": 4,
"bind": {"name": "Размер ячейки", "input": "select", "options": [1, 2, 4, 8, 16], "labels": ["1", "2", "4", "8", "16"]}
},
{
"name": "title", "value": "Плотность",
"update": "[if(resolve == 'shared', 'Общая' + if(counts, ' частота', ' вероятность'), 'Локальная плотность'), '(нормализовано)']"
}
],
"data": [
{
"name": "source",
"url": "data/cars.json",
"transform": [
{
"type": "filter",
"expr": "datum[fieldX] != null && datum.Miles_per_Gallon != null"
}
]
},
{
"name": "density",
"source": "source",
"transform": [
{
"type": "kde2d",
"groupby": ["Origin"],
"size": [{"signal": "width"}, {"signal": "height"}],
"x": {"expr": "scale('x', datum[fieldX])"},
"y": {"expr": "scale('y', datum.Miles_per_Gallon)"},
"bandwidth": {"signal": "[bandwidthX, bandwidthY]"},
"cellSize": {"signal": "cellSize"},
"counts": {"signal": "counts"}
},
{
"type": "heatmap",
"field": "grid",
"resolve": {"signal": "resolve"},
"color": {"expr": "scale('density', datum.$value / datum.$max)"},
"opacity": 1
}
]
}
],
"scales": [
{
"name": "x",
"type": "linear",
"round": true,
"nice": true,
"zero": true,
"domain": {"data": "source", "field": {"signal": "fieldX"}},
"range": "width"
},
{
"name": "y",
"type": "linear",
"round": true,
"nice": true,
"zero": true,
"domain": {"data": "source", "field": "Miles_per_Gallon"},
"range": "height"
},
{
"name": "density",
"type": "linear",
"zero": true,
"domain": [0, 1],
"range": {"scheme": "viridis"}
}
],
"axes": [
{
"scale": "y",
"domain": false,
"orient": "left",
"titlePadding": 5,
"title": "Миль на галлон",
"offset": 2
}
],
"legends": [
{
"fill": "density",
"title": {"signal": "title"},
"gradientLength": {"signal": "height - 28"}
}
],
"layout": {
"bounds": "flush",
"columns": 3,
"padding": 10
},
"marks": [
{
"type": "group",
"from": {
"facet": {
"name": "facet",
"data": "density",
"groupby": "Origin"
}
},
"sort": {"field": "datum.Origin", "order": "ascending"},
"title": {
"text": {"signal": "{'Europe': 'Европа', 'Japan': 'Япония', 'USA': 'США'}[parent.Origin]"},
"frame": "group"
},
"encode": {
"update": {
"width": {"signal": "width"},
"height": {"signal": "height"}
}
},
"axes": [
{
"scale": "x",
"domain": false,
"orient": "bottom",
"tickCount": 5,
"labelFlush": true,
"title": {"signal": "{'Acceleration': 'Ускорение', 'Displacement': 'Рабочий объём двигателя', 'Horsepower': 'Мощность'}[fieldX]"}
}
],
"marks": [
{
"type": "image",
"from": {"data": "facet"},
"encode": {
"update": {
"x": {"value": 0},
"y": {"value": 0},
"image": {"field": "image"},
"width": {"signal": "width"},
"height": {"signal": "height"},
"aspect": {"value": false},
"smooth": {"signal": "smooth"}
}
}
}
]
}
]
}