问题描述
我想知道Vega-lite如何将标记与关联的编码相关联。
在下面的示例中,编码和标记均位于规范的“顶层”:
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json","description": "A simple bar chart with embedded data.","data": {
"values": [
{"a": "A","b": 28},{"a": "B","b": 55},{"a": "C","b": 43},{"a": "D","b": 91},{"a": "E","b": 81},{"a": "F","b": 53},{"a": "G","b": 19},{"a": "H","b": 87},{"a": "I","b": 52}
]
},"mark": "bar","encoding": {
"x": {"field": "a","type": "nominal","axis": {"labelAngle": 0}},"y": {"field": "b","type": "quantitative"}
}
}
在最简单的图层示例中,条形标记和文本标记都嵌套在Layer属性中
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json","description": "Bar chart with text labels. Apply scale padding to make the frame cover the labels.","b": 43}
]
},"encoding": {
"y": {"field": "a","type": "nominal"},"x": {"field": "b","type": "quantitative","scale": {"padding": 10}}
},"layer": [{
"mark": "bar"
},{
"mark": {
"type": "text","align": "left","baseline": "middle","dx": 3
},"encoding": {
"text": {"field": "b","type": "quantitative"}
}
}]
}
-
此外,我注意到我不能将Bar标记移到Layer属性之外(Vega Editor提示这不是允许的属性,如果放置在顶层,bar则无法渲染)。
-
最后,在更复杂的示例中(请参见:https://vega.github.io/vega-lite/examples/layer_line_mean_point_raw.html),在层中重复编码(尽管具有冗余x编码)->因此,在这种情况下,何时适合是将编码放在顶层还是在顶层?
Vega-lite文档对这些属性的配置进行了相当详细的介绍,但我无法找到这三个问题的概念性答案。
谢谢
解决方法
Vega-Lite提供了一个层次结构的图表模型,其中层次结构中的每个级别都可以覆盖父级别中声明的各种属性。在层规范方面,相关概念是这样的:
- 您认为
UnitSpec
是一张图表:您可以指定data
,mark
,encodings
,transforms
和其他属性。 -
LayerSpec
是一个容器,可以在UnitSpec
属性中容纳许多LayerSpec
或layers
规范。此外,您可以指定data
,encodings
transforms
和其他属性(但不能指定mark
)。
在UnitSpec
或其他顶级对象中的LayerSpec
将继承在那里指定的任何属性(例如data
,encodings
,transforms
等),还可以通过指定自己的data
,encodings
或transforms
覆盖它们。
类似的层次结构概念也适用于其他复合图表类型,例如ConcatSpec
,VConcatSpec
,HConcatSpec
,FacetSpec
等。
更具体地说,在您的示例中,data
和某些encodings
在顶层中定义:
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json","description": "Bar chart with text labels. Apply scale padding to make the frame cover the labels.","data": {
"values": [
{"a": "A","b": 28},{"a": "B","b": 55},{"a": "C","b": 43}
]
},"encoding": {
"y": {"field": "a","type": "nominal"},"x": {"field": "b","type": "quantitative","scale": {"padding": 10}}
},"layer": [{
"mark": "bar"
},{
"mark": {
"type": "text","align": "left","baseline": "middle","dx": 3
},"encoding": {
"text": {"field": "b","type": "quantitative"}
}
}]
}
就从父级继承而言,这在功能上等效于以下内容,其中我将data
和encodings
从顶层移到了每个包含的UnitSpec
中:>
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json","layer": [{
"data": {
"values": [
{"a": "A","b": 43}
]
},"mark": "bar"
"encoding": {
"y": {"field": "a","scale": {"padding": 10}}
},},{
"data": {
"values": [
{"a": "A","mark": {
"type": "text","encoding": {
"y": {"field": "a","scale": {"padding": 10}}
"text": {"field": "b","type": "quantitative"}
}
}]
}
在顶层指定共享属性是一种使图表规范更加简洁和易于理解的方法。