基于选择的编码动态改变 Y 轴字段 Vega-Lite
Dynamically Change Y-Axis Field in Encoding Based on Selection Vega-Lite
如何根据 selection 动态更改为 y 轴编码的数据字段?我正在尝试构建一个可视化来显示一天 24 小时内的事件计数数据,我希望用户能够 select 不同的时区(例如 EST、CST、MST 或 PST)。
为此,我构建了一个 selection,我在其中指定了上面括号中列出的所有选项,并将 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"
},
当它放在一起时,可视化看起来像这样,它根据 selection:
动态更新
当我的代码是静态的时,它看起来像这样:
"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"
}
...
}
这是我的代码的 link:
vega editor.
选择只能过滤列值,不能过滤列名。幸运的是,您可以使用 Fold Transform.
将列名转换为列值
为了完成你想要的,我建议如下:
- 使用一系列 Calculate Transforms 来计算包含您要显示的值的新列。
- 使用 Fold Transform 将这些值堆叠到具有关联键列的单个列中。
- Link 绑定到折叠转换中创建的键列的选择。
- 使用Filter Transform根据选择过滤值
- 最后,添加行编码,使选定的列标记在轴上。
放在一起,它看起来像这样 (open in vega editor):
{
"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
}
}
}
如何根据 selection 动态更改为 y 轴编码的数据字段?我正在尝试构建一个可视化来显示一天 24 小时内的事件计数数据,我希望用户能够 select 不同的时区(例如 EST、CST、MST 或 PST)。
为此,我构建了一个 selection,我在其中指定了上面括号中列出的所有选项,并将 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"
},
当它放在一起时,可视化看起来像这样,它根据 selection:
动态更新当我的代码是静态的时,它看起来像这样:
"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"
}
...
}
这是我的代码的 link: vega editor.
选择只能过滤列值,不能过滤列名。幸运的是,您可以使用 Fold Transform.
将列名转换为列值为了完成你想要的,我建议如下:
- 使用一系列 Calculate Transforms 来计算包含您要显示的值的新列。
- 使用 Fold Transform 将这些值堆叠到具有关联键列的单个列中。
- Link 绑定到折叠转换中创建的键列的选择。
- 使用Filter Transform根据选择过滤值
- 最后,添加行编码,使选定的列标记在轴上。
放在一起,它看起来像这样 (open in vega editor):
{
"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
}
}
}