#vega-lite #vega
#vega-lite #vega
Вопрос:
Как я могу динамически изменять поле данных, закодированное для оси y, на основе выбора? Я пытаюсь создать визуализацию для отображения данных о количестве событий за 24 часа в сутки, и я хочу, чтобы пользователь мог выбирать разные часовые пояса (например, EST, CST, MST или PST).
Для этого я создал единый выбор, в котором я указываю все параметры, которые я перечислил выше, в круглых скобках, при этом значение EST установлено по умолчанию. Я хочу создать условие, при котором, когда я выбираю другой вариант, кроме EST, я вижу, что визуализация динамически обновляется. Я исследовал возможность создания других полей часов специально для этих временных рамок или добавления логики условий, чтобы попытаться учесть эти динамические изменения, но я пока не нашел хорошего решения. Кто-нибудь может помочь?
Вот пример того, как выглядят несколько строк моих данных
"data": {
"values": [
{
"title_column":"example",
"Type": "Technology",
"Events": "100",
"Hour": "0",
"Date": "9/1/20",
"Time Period": "Last Time"
},
{
"title_column":"example",
"Type": "Technology",
"Events": "110",
"Hour": "1",
"Date": "9/1/20",
"Time Period": "Last Time"
},
и визуализация выглядит так, когда она собирается вместе, при этом она динамически обновляется на основе выбора:
И когда мой код статичен, он выглядит так:
"layer":[
{"mark":{
"type":"bar",
"point":true,
"color":"#FFC94E",
"height":15
},
"selection": {
"timezone": {
"type": "single",
"init": {"changer": "EST"},
"bind": {
"changer": {"input": "select",
"options": ["EST","CST (-1 Hour)","MST (-2 Hours)","PST (-3 Hours)"]}
}
}
},
"encoding":
{
"x":{"field":"Events",
"type":"quantitative",
"aggregate":"sum",
"axis":null},
"y": {"field":"Hour",
"type":"ordinal",
"axis":{
"labelSeparation":1,
"labelPadding":4,
"title":null
}
}
}}]
}
Однако, сосредоточив внимание, в частности, на кодировке y нижней части кода, я бы в идеале хотел сделать это динамичным. Я думаю, что мог бы создать вычисления для каждого из часовых поясов, а затем написать условие, которое работает, как показано ниже, но я не смог заставить это работать. Любая помощь приветствуется!
"y": {
"condition": {
"selection": {"timezone" : "EST"},
"datum": "datum.Hour"
}
"condition": {
"selection": {"timezone" : "CST (-1 Hour)"},
"datum": "datum.Hour_CST"
}
...
}
Вот ссылка на мой код:
редактор vega.
Комментарии:
1. Вот ссылка на
Ответ №1:
Выборки могут фильтроваться только по значениям столбцов, а не по именам столбцов. К счастью, вы можете преобразовать имена столбцов в значения столбцов с помощью преобразования сгиба.
Чтобы выполнить то, что вы хотите, я бы предложил следующее:
- Используйте серию вычислительных преобразований для вычисления новых столбцов, содержащих значения, которые вы хотите отобразить.
- Используйте преобразование сгиба, чтобы сложить эти значения в один столбец с соответствующим ключевым столбцом.
- Свяжите привязку выбора с ключевым столбцом, созданным при преобразовании сгиба.
- Используйте преобразование фильтра для фильтрации значений на основе выбора
- Наконец, добавьте кодировку строки, чтобы выбранный столбец был помечен на оси.
В совокупности это выглядит так (открыть в редакторе vega):
{
"width": 300,
"data": {
"values": [...]
},
"transform": [
{"filter": {"field": "Time Period", "equal": "Last Time"}},
{"calculate": "datum.Hour - 0", "as": "EST"},
{"calculate": "datum.Hour - 1", "as": "CST (-1 Hour)"},
{"calculate": "datum.Hour - 2", "as": "MST (-2 Hours)"},
{"calculate": "datum.Hour - 3", "as": "PST (-3 Hours)"},
{
"fold": ["EST", "CST (-1 Hour)", "MST (-2 Hours)", "PST (-3 Hours)"],
"as": ["Zone", "Hour"]
},
{"filter": {"selection": "timezone"}}
],
"selection": {
"timezone": {
"type": "single",
"init": {"Zone": "EST"},
"bind": {
"Zone": {
"name": "timezone",
"input": "select",
"options": [
"EST",
"CST (-1 Hour)",
"MST (-2 Hours)",
"PST (-3 Hours)"
]
}
}
}
},
"mark": {"type": "bar", "point": true, "color": "#FFC94E", "height": 15},
"encoding": {
"x": {
"field": "Events",
"type": "quantitative",
"aggregate": "sum",
"axis": null
},
"y": {
"field": "Hour",
"type": "ordinal",
"axis": {"labelSeparation": 1, "labelPadding": 4, "title": null}
},
"row": {
"field": "Zone",
"type": "nominal",
"title": null
}
}
}
Комментарии:
1. Это именно то, что мне было нужно! Спасибо