Vega-lite:根据选择自定义轴样式
Vega-lite: customize axis style based on selection
我正在尝试根据选择自定义轴标签的样式,这意味着该标签是否包含在选择中。
从此演示规范 (Open the Chart in the Vega Editor) 开始,选择按预期工作,突出显示所选柱:
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json",
"data": {
"values": [
{ "model": "Sedan", "sales": 12 },
{ "model": "Coupe", "sales": 10 },
{ "model": "Sports car", "sales": 35 },
{ "model": "Station wagon", "sales": 69 },
{ "model": "Hatchback", "sales": 91 },
{ "model": "Convertible", "sales": 53 },
{ "model": "Sport-utility vehicle", "sales": 14 },
{ "model": "Minivan", "sales": 48 }
]
},
"mark": "bar",
"selection": {
"select_model": { "type": "single", "fields": ["model"] }
},
"encoding": {
"y": { "field": "model" },
"x": { "field": "sales", "type": "quantitative" },
"fillOpacity": {
"value": 0.3,
"condition": { "selection": "select_model", "value": 1 }
}
}
}
但我也想突出显示轴标签(并可能接受对它们的点击?我不确定这是否可能)
如果我尝试用这个替换 Y 编码:
"y": {
"field": "model",
"axis": {
"labelOpacity": {
"value": 0.3,
"condition": {
"test": { "selection": "select_model" },
"value": 1
}
}
}
}
我收到以下错误:
Cannot read property 'getSelectionComponent' of null
我做错了什么?
您的方法不起作用的原因是比例标签从未包含在选择中。您可以通过使用 vega expression 显式测试标签是否存在于所选值中来完成您想要的操作。它可能看起来像这样:
"axis": {
"labelOpacity": {
"value": 0.3,
"condition": {
"test": "indexof(select_model.model || [], datum.value) >= 0",
"value": 1
}
}
}
这是完整的结果 (view in editor):
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json",
"data": {
"values": [
{"model": "Sedan", "sales": 12},
{"model": "Coupe", "sales": 10},
{"model": "Sports car", "sales": 35},
{"model": "Station wagon", "sales": 69},
{"model": "Hatchback", "sales": 91},
{"model": "Convertible", "sales": 53},
{"model": "Sport-utility vehicle", "sales": 14},
{"model": "Minivan", "sales": 48}
]
},
"mark": "bar",
"selection": {
"select_model": {"type": "single", "fields": ["model"], "empty": "none"}
},
"transform": [
{"calculate": "indexof(select_model.model || [], 'Hatchback')", "as": "Val"}
],
"encoding": {
"y": {
"field": "model",
"axis": {
"labelOpacity": {
"value": 0.3,
"condition": {
"test": "indexof(select_model.model || [], datum.value) >= 0",
"value": 1
}
}
}
},
"x": {"field": "sales", "type": "quantitative"},
"fillOpacity": {
"value": 0.3,
"condition": {"selection": "select_model", "value": 1}
}
}
}
我正在尝试根据选择自定义轴标签的样式,这意味着该标签是否包含在选择中。
从此演示规范 (Open the Chart in the Vega Editor) 开始,选择按预期工作,突出显示所选柱:
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json",
"data": {
"values": [
{ "model": "Sedan", "sales": 12 },
{ "model": "Coupe", "sales": 10 },
{ "model": "Sports car", "sales": 35 },
{ "model": "Station wagon", "sales": 69 },
{ "model": "Hatchback", "sales": 91 },
{ "model": "Convertible", "sales": 53 },
{ "model": "Sport-utility vehicle", "sales": 14 },
{ "model": "Minivan", "sales": 48 }
]
},
"mark": "bar",
"selection": {
"select_model": { "type": "single", "fields": ["model"] }
},
"encoding": {
"y": { "field": "model" },
"x": { "field": "sales", "type": "quantitative" },
"fillOpacity": {
"value": 0.3,
"condition": { "selection": "select_model", "value": 1 }
}
}
}
但我也想突出显示轴标签(并可能接受对它们的点击?我不确定这是否可能)
如果我尝试用这个替换 Y 编码:
"y": {
"field": "model",
"axis": {
"labelOpacity": {
"value": 0.3,
"condition": {
"test": { "selection": "select_model" },
"value": 1
}
}
}
}
我收到以下错误:
Cannot read property 'getSelectionComponent' of null
我做错了什么?
您的方法不起作用的原因是比例标签从未包含在选择中。您可以通过使用 vega expression 显式测试标签是否存在于所选值中来完成您想要的操作。它可能看起来像这样:
"axis": {
"labelOpacity": {
"value": 0.3,
"condition": {
"test": "indexof(select_model.model || [], datum.value) >= 0",
"value": 1
}
}
}
这是完整的结果 (view in editor):
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json",
"data": {
"values": [
{"model": "Sedan", "sales": 12},
{"model": "Coupe", "sales": 10},
{"model": "Sports car", "sales": 35},
{"model": "Station wagon", "sales": 69},
{"model": "Hatchback", "sales": 91},
{"model": "Convertible", "sales": 53},
{"model": "Sport-utility vehicle", "sales": 14},
{"model": "Minivan", "sales": 48}
]
},
"mark": "bar",
"selection": {
"select_model": {"type": "single", "fields": ["model"], "empty": "none"}
},
"transform": [
{"calculate": "indexof(select_model.model || [], 'Hatchback')", "as": "Val"}
],
"encoding": {
"y": {
"field": "model",
"axis": {
"labelOpacity": {
"value": 0.3,
"condition": {
"test": "indexof(select_model.model || [], datum.value) >= 0",
"value": 1
}
}
}
},
"x": {"field": "sales", "type": "quantitative"},
"fillOpacity": {
"value": 0.3,
"condition": {"selection": "select_model", "value": 1}
}
}
}