如何使用标记类型 rect 在 vega 图表中的选定日期范围之间突出显示具有背景颜色的区域
How to highlight area with background color between selected date range in vega chart using marks type rect
在折线图中,我有时间戳的 x 轴和带有数值的 y 轴,我可以在特定时间戳(开始时间和结束时间)之间绘制一条带有数值的线(y 轴) .而不是高亮区域所需的线。尝试使用标记类型 rect 但具有硬编码值 widthenter image description here 和 height,需要通过坐标或其他方式使其动态化。
规格:
{
"$schema":"https://vega.github.io/schema/vega/v5.json",
"autosize":{
"type":"pad",
"resize":true
},
"padding":5,
"width":800,
"height":200,
"style":"",
"signals":[
{
"name":"x3",
"value":1607592500000
},
{
"name":"x2",
"value":1607592500000
},
{
"name":"x",
"value":1607592500000
},
{
"name":"Endtimex3",
"value":1607998500000
},
{
"name":"Endtimex2",
"value":0
},
{
"name":"Endtimex",
"value":0
},
{"name": "nominaly", "value": 4},
{
"name":"y",
"value":0
},
{
"name":"y2",
"value":200
},
{
"name":"strokeWidth",
"value":2
},
{
"name":"strokeCap",
"value":"butt"
},
{
"name":"strokeDash",
"value":[
8,
4
]
},
{
"name":"y3",
"value":60
},
{
"name":"dx",
"value":-15
},
{
"name":"dy",
"value":15
},
{
"name":"angle",
"value":0
},
{
"name":"limit",
"value":0
},
{
"name":"align",
"value":"right"
},
{
"name":"alignleft",
"value":"left"
},
{
"name":"baseline",
"value":"alphabetic"
},
{
"name":"bottom",
"value":"bottom"
},
{
"name": "interpolate", "value": "linear"
},
{ "name": "color", "value": "both"},
{
"name":"anchor",
"value":[
0,
0
],
"on":[
{
"events":"wheel",
"update":"[invert('x', x()), invert('y', y())]"
}
]
},
{
"name":"zoom",
"value":1,
"on":[
{
"events":"wheel!",
"force":true,
"update":"pow(1.001, event.deltaY * pow(16, event.deltaMode))"
}
]
},
{
"name":"xdom",
"update":"xext",
"on":[
{
"events":{
"signal":"zoom"
},
"update":"[time(anchor[0]) + (time(xdom[0]) - time(anchor[0])) * zoom, time(anchor[0]) + (time(xdom[1]) - time(anchor[0])) * zoom]"
}
]
}
],
"data":[
{
"name":"table",
"values": [ {"count":1,"category":"volume","dateTime":1608006600000,"anomalous":true},{"count":2,"category":"volume","dateTime":1608000900000,"anomalous":true},{"count":3,"category":"volume","dateTime":1608011400000,"anomalous":true},{"count":4,"category":"volume","dateTime":1608005700000,"anomalous":true},{"count":7,"category":"volume","dateTime":1608003300000,"anomalous":true},{"count":4,"category":"volume","dateTime":1608000000000,"anomalous":true},{"count":2,"category":"volume","dateTime":1608009000000,"anomalous":true},{"count":6,"category":"volume","dateTime":1608012300000,"anomalous":true},{"count":2,"category":"volume","dateTime":1606959600000,"anomalous":false},{"count":0,"category":"volume","dateTime":1607263800000,"anomalous":false},{"count":0,"category":"volume","dateTime":1607102700000,"anomalous":false},{"count":5,"category":"volume","dateTime":1606971000000,"anomalous":false},{"count":4,"category":"volume","dateTime":1606951200000,"anomalous":false},{"count":6,"category":"volume","dateTime":1607735700000,"anomalous":false},{"count":4,"category":"volume","dateTime":1607971200000,"anomalous":false},{"count":4,"category":"volume","dateTime":1606989000000,"anomalous":false},{"count":5,"category":"volume","dateTime":1607386500000,"anomalous":false},{"count":0,"category":"volume","dateTime":1606834500000,"anomalous":false},{"count":5,"category":"volume","dateTime":1607355300000,"anomalous":false},{"count":4,"category":"volume","dateTime":1606977600000,"anomalous":false},{"count":5,"category":"volume","dateTime":1607243400000,"anomalous":false}]
},
{
"name":"data_0",
"source":"table",
"transform":[
{
"type":"formula",
"expr":"toDate(datum[\"dateTime\"])",
"as":"dateTime"
},
{
"type":"extent",
"field":"dateTime",
"signal":"xext"
}
]
}
],
"marks":[
{
"type": "rect",
"encode": {
"enter": {
"fill": {"value": "#939597"},
"stroke": {"value": "#652c90"}
},
"update": {
"x": {"signal": "x", "scale":"x"},
"y": {"signal": "y"},
"width": {"signal": "280"},
"height": {"signal": "100"},
"opacity": {"value": 1},
"strokeWidth": {"signal": "strokeWidth"},
"fillOpacity": {"signal": "1"},
"strokeOpacity": {"signal": "0"}
},
"hover": {
"opacity": {"value": 0.5}
}
}
},
{
"type":"rule",
"clip":true,
"encode":{
"enter":{
"stroke":{
"value":"red"
}
},
"update":{
"x":{
"signal":"x",
"scale":"x"
},
"y":{
"signal":"y"
},
"x2":{
"signal":"x2",
"scale":"x"
},
"y2":{
"signal":"y2"
},
"strokeWidth":{
"signal":"strokeWidth"
},
"strokeDash":{
"signal":"strokeDash"
},
"strokeCap":{
"signal":"strokeCap"
},
"opacity":{
"value":1
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"rule",
"clip":true,
"encode":{
"enter":{
"stroke":{
"value":"red"
}
},
"update":{
"x":{
"signal":"Endtimex3",
"scale":"x"
},
"y":{
"signal":"y"
},
"x2":{
"signal":"Endtimex3",
"scale":"x"
},
"y2":{
"signal":"y2"
},
"strokeWidth":{
"signal":"strokeWidth"
},
"strokeDash":{
"signal":"strokeDash"
},
"strokeCap":{
"signal":"strokeCap"
},
"opacity":{
"value":1
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"text",
"clip":true,
"encode":{
"enter":{
"fill":{
"value":"black"
},
"text":{
"value":"Anomaly Start Time"
}
},
"update":{
"opacity":{
"value":1
},
"x":{
"signal":"x3",
"scale":"x"
},
"y":{
"signal":"y3"
},
"dx":{
"signal":"dx"
},
"angle":{
"signal":"angle"
},
"align":{
"signal":"align"
},
"baseline":{
"signal":"baseline"
},
"limit":{
"signal":"limit"
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"text",
"clip":true,
"encode":{
"enter":{
"fill":{
"value":"black"
},
"text":{
"value":"Anomaly End Time"
}
},
"update":{
"opacity":{
"value":1
},
"x":{
"signal":"Endtimex3",
"scale":"x"
},
"y":{
"signal":"y3"
},
"dx":{
"signal":"dy"
},
"angle":{
"signal":"angle"
},
"align":{
"signal":"alignleft"
},
"baseline":{
"signal":"baseline"
},
"limit":{
"signal":"limit"
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"text",
"clip":true,
"encode":{
"enter":{
"fill":{
"value":"black"
},
"text":{
"value":"Nominal Volume"
}
},
"update":{
"opacity":{
"value":1
},
"x":{
"signal":"x3",
"scale":"x"
},
"y":{
"signal":"nominaly",
"scale": "y"
},
"dx":{
"signal":"dy"
},
"angle":{
"signal":"angle"
},
"align":{
"signal":"alignleft"
},
"baseline":{
"signal":"bottom"
},
"limit":{
"signal":"limit"
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"rule",
"clip":true,
"encode":{
"enter":{
"stroke":{
"value":"grey"
}
},
"update":{
"x":{
"signal":"x3",
"scale":"x"
},
"y":{
"signal":"nominaly",
"scale": "y"
},
"x2":{
"signal":"Endtimex3",
"scale":"x"
},
"y2":{
"signal":"nominaly",
"scale": "y"
},
"width": {"signal": "100"},
"height": {"signal": "150"},
"strokeWidth":{
"signal":"strokeWidth"
},
"strokeDash":{
"signal":"strokeDash"
},
"strokeCap":{
"signal":"strokeCap"
},
"opacity":{
"value":1
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"name":"pathgroup",
"type":"group",
"clip":true,
"from":{
"facet":{
"name":"faceted_path_main",
"data":"data_0",
"groupby":[
"category"
]
}
},
"encode":{
"update":{
"width":{
"field":{
"group":"width"
}
},
"height":{
"field":{
"group":"height"
}
}
}
},
"marks":[
{
"name":"marks",
"type":"line",
"style":[
"line"
],
"sort":{
"field":"datum[\"dateTime\"]",
"order":"descending"
},
"from":{
"data":"faceted_path_main"
},
"encode":{
"update":{
"interpolate":{
"signal":"interpolate"
},
"opacity":[
{
"value":0.7
}
],
"stroke":[
{
"scale":"color",
"field":"category"
}
],
"tooltip":{
"signal":"{\"Time\": timeFormat(datum[\"dateTime\"], '%b %d, %Y %H:%M'), \"Count\": format(datum[\"count\"], \"\"), \"category\": ''+datum[\"category\"]}"
},
"x":{
"scale":"x",
"field":"dateTime"
},
"y":{
"scale":"y",
"field":"count"
},
"defined":{
"signal":"datum[\"dateTime\"] !== null && !isNaN(datum[\"dateTime\"]) && datum[\"count\"] !== null && !isNaN(datum[\"count\"])"
}
}
}
}
]
}
],
"scales":[
{
"name":"x",
"type":"time",
"domain":{
"data":"data_0",
"field":"dateTime"
},
"range":[
0,
{
"signal":"width"
}
]
},
{
"name":"y",
"type":"linear",
"domain":{
"data":"data_0",
"field":"count"
},
"range":[
{
"signal":"height"
},
0
],
"nice":true,
"zero":true
},
{
"name":"color",
"type":"ordinal",
"domain":{
"data":"data_0",
"field":"category",
"sort":true
},
"range":{
"scheme":"accent"
}
}
],
"axes":[
{
"scale":"x",
"orient":"bottom",
"grid":false,
"title":"Time(5 minutes window)",
"labelFlush":true,
"labelOverlap":true,
"labelSeparation":10,
"tickCount":{
"signal":"ceil(width/10)"
},
"titleColor":"black",
"labelColor":"black",
"zindex":1,
"encode":{
"labels":{
"update":{
"text":{
"signal":"timeFormat(datum.value, '%b %d, %Y %H:%M')"
}
}
}
}
},
{
"scale":"y",
"orient":"left",
"grid":false,
"title":"Count",
"labelOverlap":true,
"labelSeparation":10,
"tickCount":{
"signal":"ceil(height/40)"
},
"titleColor":"black",
"labelColor":"black",
"zindex":1
}
],
"legends":[
{
"stroke":"color",
"title":"",
"titleColor":"black",
"labelColor":"black",
"orient":"top-left",
"encode":{
"symbols":{
"name":"legendSymbol",
"interactive":true,
"update":{
"fill":{
"value":"transparent"
},
"strokeWidth":{
"value":2
},
"opacity":[
{
"value":0.7
}
],
"size":{
"value":64
}
}
},
"labels":{
"name":"legendLabel",
"interactive":true,
"update":{
"opacity":[
{
"value":1
}
]
}
}
}
}
],
"config":{
"axisY":{
"minExtent":30
}
}
}
通过使用矩形标记得到修复。
"type":"rect",
"encode":{
"enter":{
"x":{
"scale":"x",
"signal":"x3"
},
"x2":{
"scale":"x",
"signal":"Endtimex3"
},
"y":{
"value":0
},
"y2":{
"signal":"height"
} ,
"fill":{
"value":"red"
},
"stroke":{
"value":"red"
},
"strokeWidth":{
"value":1
},
"fillOpacity":{
"value":1
},
"opacity":{
"value":0.1
}
}
}
}
在折线图中,我有时间戳的 x 轴和带有数值的 y 轴,我可以在特定时间戳(开始时间和结束时间)之间绘制一条带有数值的线(y 轴) .而不是高亮区域所需的线。尝试使用标记类型 rect 但具有硬编码值 widthenter image description here 和 height,需要通过坐标或其他方式使其动态化。
规格:
{
"$schema":"https://vega.github.io/schema/vega/v5.json",
"autosize":{
"type":"pad",
"resize":true
},
"padding":5,
"width":800,
"height":200,
"style":"",
"signals":[
{
"name":"x3",
"value":1607592500000
},
{
"name":"x2",
"value":1607592500000
},
{
"name":"x",
"value":1607592500000
},
{
"name":"Endtimex3",
"value":1607998500000
},
{
"name":"Endtimex2",
"value":0
},
{
"name":"Endtimex",
"value":0
},
{"name": "nominaly", "value": 4},
{
"name":"y",
"value":0
},
{
"name":"y2",
"value":200
},
{
"name":"strokeWidth",
"value":2
},
{
"name":"strokeCap",
"value":"butt"
},
{
"name":"strokeDash",
"value":[
8,
4
]
},
{
"name":"y3",
"value":60
},
{
"name":"dx",
"value":-15
},
{
"name":"dy",
"value":15
},
{
"name":"angle",
"value":0
},
{
"name":"limit",
"value":0
},
{
"name":"align",
"value":"right"
},
{
"name":"alignleft",
"value":"left"
},
{
"name":"baseline",
"value":"alphabetic"
},
{
"name":"bottom",
"value":"bottom"
},
{
"name": "interpolate", "value": "linear"
},
{ "name": "color", "value": "both"},
{
"name":"anchor",
"value":[
0,
0
],
"on":[
{
"events":"wheel",
"update":"[invert('x', x()), invert('y', y())]"
}
]
},
{
"name":"zoom",
"value":1,
"on":[
{
"events":"wheel!",
"force":true,
"update":"pow(1.001, event.deltaY * pow(16, event.deltaMode))"
}
]
},
{
"name":"xdom",
"update":"xext",
"on":[
{
"events":{
"signal":"zoom"
},
"update":"[time(anchor[0]) + (time(xdom[0]) - time(anchor[0])) * zoom, time(anchor[0]) + (time(xdom[1]) - time(anchor[0])) * zoom]"
}
]
}
],
"data":[
{
"name":"table",
"values": [ {"count":1,"category":"volume","dateTime":1608006600000,"anomalous":true},{"count":2,"category":"volume","dateTime":1608000900000,"anomalous":true},{"count":3,"category":"volume","dateTime":1608011400000,"anomalous":true},{"count":4,"category":"volume","dateTime":1608005700000,"anomalous":true},{"count":7,"category":"volume","dateTime":1608003300000,"anomalous":true},{"count":4,"category":"volume","dateTime":1608000000000,"anomalous":true},{"count":2,"category":"volume","dateTime":1608009000000,"anomalous":true},{"count":6,"category":"volume","dateTime":1608012300000,"anomalous":true},{"count":2,"category":"volume","dateTime":1606959600000,"anomalous":false},{"count":0,"category":"volume","dateTime":1607263800000,"anomalous":false},{"count":0,"category":"volume","dateTime":1607102700000,"anomalous":false},{"count":5,"category":"volume","dateTime":1606971000000,"anomalous":false},{"count":4,"category":"volume","dateTime":1606951200000,"anomalous":false},{"count":6,"category":"volume","dateTime":1607735700000,"anomalous":false},{"count":4,"category":"volume","dateTime":1607971200000,"anomalous":false},{"count":4,"category":"volume","dateTime":1606989000000,"anomalous":false},{"count":5,"category":"volume","dateTime":1607386500000,"anomalous":false},{"count":0,"category":"volume","dateTime":1606834500000,"anomalous":false},{"count":5,"category":"volume","dateTime":1607355300000,"anomalous":false},{"count":4,"category":"volume","dateTime":1606977600000,"anomalous":false},{"count":5,"category":"volume","dateTime":1607243400000,"anomalous":false}]
},
{
"name":"data_0",
"source":"table",
"transform":[
{
"type":"formula",
"expr":"toDate(datum[\"dateTime\"])",
"as":"dateTime"
},
{
"type":"extent",
"field":"dateTime",
"signal":"xext"
}
]
}
],
"marks":[
{
"type": "rect",
"encode": {
"enter": {
"fill": {"value": "#939597"},
"stroke": {"value": "#652c90"}
},
"update": {
"x": {"signal": "x", "scale":"x"},
"y": {"signal": "y"},
"width": {"signal": "280"},
"height": {"signal": "100"},
"opacity": {"value": 1},
"strokeWidth": {"signal": "strokeWidth"},
"fillOpacity": {"signal": "1"},
"strokeOpacity": {"signal": "0"}
},
"hover": {
"opacity": {"value": 0.5}
}
}
},
{
"type":"rule",
"clip":true,
"encode":{
"enter":{
"stroke":{
"value":"red"
}
},
"update":{
"x":{
"signal":"x",
"scale":"x"
},
"y":{
"signal":"y"
},
"x2":{
"signal":"x2",
"scale":"x"
},
"y2":{
"signal":"y2"
},
"strokeWidth":{
"signal":"strokeWidth"
},
"strokeDash":{
"signal":"strokeDash"
},
"strokeCap":{
"signal":"strokeCap"
},
"opacity":{
"value":1
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"rule",
"clip":true,
"encode":{
"enter":{
"stroke":{
"value":"red"
}
},
"update":{
"x":{
"signal":"Endtimex3",
"scale":"x"
},
"y":{
"signal":"y"
},
"x2":{
"signal":"Endtimex3",
"scale":"x"
},
"y2":{
"signal":"y2"
},
"strokeWidth":{
"signal":"strokeWidth"
},
"strokeDash":{
"signal":"strokeDash"
},
"strokeCap":{
"signal":"strokeCap"
},
"opacity":{
"value":1
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"text",
"clip":true,
"encode":{
"enter":{
"fill":{
"value":"black"
},
"text":{
"value":"Anomaly Start Time"
}
},
"update":{
"opacity":{
"value":1
},
"x":{
"signal":"x3",
"scale":"x"
},
"y":{
"signal":"y3"
},
"dx":{
"signal":"dx"
},
"angle":{
"signal":"angle"
},
"align":{
"signal":"align"
},
"baseline":{
"signal":"baseline"
},
"limit":{
"signal":"limit"
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"text",
"clip":true,
"encode":{
"enter":{
"fill":{
"value":"black"
},
"text":{
"value":"Anomaly End Time"
}
},
"update":{
"opacity":{
"value":1
},
"x":{
"signal":"Endtimex3",
"scale":"x"
},
"y":{
"signal":"y3"
},
"dx":{
"signal":"dy"
},
"angle":{
"signal":"angle"
},
"align":{
"signal":"alignleft"
},
"baseline":{
"signal":"baseline"
},
"limit":{
"signal":"limit"
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"text",
"clip":true,
"encode":{
"enter":{
"fill":{
"value":"black"
},
"text":{
"value":"Nominal Volume"
}
},
"update":{
"opacity":{
"value":1
},
"x":{
"signal":"x3",
"scale":"x"
},
"y":{
"signal":"nominaly",
"scale": "y"
},
"dx":{
"signal":"dy"
},
"angle":{
"signal":"angle"
},
"align":{
"signal":"alignleft"
},
"baseline":{
"signal":"bottom"
},
"limit":{
"signal":"limit"
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"type":"rule",
"clip":true,
"encode":{
"enter":{
"stroke":{
"value":"grey"
}
},
"update":{
"x":{
"signal":"x3",
"scale":"x"
},
"y":{
"signal":"nominaly",
"scale": "y"
},
"x2":{
"signal":"Endtimex3",
"scale":"x"
},
"y2":{
"signal":"nominaly",
"scale": "y"
},
"width": {"signal": "100"},
"height": {"signal": "150"},
"strokeWidth":{
"signal":"strokeWidth"
},
"strokeDash":{
"signal":"strokeDash"
},
"strokeCap":{
"signal":"strokeCap"
},
"opacity":{
"value":1
}
},
"hover":{
"opacity":{
"value":0.5
}
}
}
},
{
"name":"pathgroup",
"type":"group",
"clip":true,
"from":{
"facet":{
"name":"faceted_path_main",
"data":"data_0",
"groupby":[
"category"
]
}
},
"encode":{
"update":{
"width":{
"field":{
"group":"width"
}
},
"height":{
"field":{
"group":"height"
}
}
}
},
"marks":[
{
"name":"marks",
"type":"line",
"style":[
"line"
],
"sort":{
"field":"datum[\"dateTime\"]",
"order":"descending"
},
"from":{
"data":"faceted_path_main"
},
"encode":{
"update":{
"interpolate":{
"signal":"interpolate"
},
"opacity":[
{
"value":0.7
}
],
"stroke":[
{
"scale":"color",
"field":"category"
}
],
"tooltip":{
"signal":"{\"Time\": timeFormat(datum[\"dateTime\"], '%b %d, %Y %H:%M'), \"Count\": format(datum[\"count\"], \"\"), \"category\": ''+datum[\"category\"]}"
},
"x":{
"scale":"x",
"field":"dateTime"
},
"y":{
"scale":"y",
"field":"count"
},
"defined":{
"signal":"datum[\"dateTime\"] !== null && !isNaN(datum[\"dateTime\"]) && datum[\"count\"] !== null && !isNaN(datum[\"count\"])"
}
}
}
}
]
}
],
"scales":[
{
"name":"x",
"type":"time",
"domain":{
"data":"data_0",
"field":"dateTime"
},
"range":[
0,
{
"signal":"width"
}
]
},
{
"name":"y",
"type":"linear",
"domain":{
"data":"data_0",
"field":"count"
},
"range":[
{
"signal":"height"
},
0
],
"nice":true,
"zero":true
},
{
"name":"color",
"type":"ordinal",
"domain":{
"data":"data_0",
"field":"category",
"sort":true
},
"range":{
"scheme":"accent"
}
}
],
"axes":[
{
"scale":"x",
"orient":"bottom",
"grid":false,
"title":"Time(5 minutes window)",
"labelFlush":true,
"labelOverlap":true,
"labelSeparation":10,
"tickCount":{
"signal":"ceil(width/10)"
},
"titleColor":"black",
"labelColor":"black",
"zindex":1,
"encode":{
"labels":{
"update":{
"text":{
"signal":"timeFormat(datum.value, '%b %d, %Y %H:%M')"
}
}
}
}
},
{
"scale":"y",
"orient":"left",
"grid":false,
"title":"Count",
"labelOverlap":true,
"labelSeparation":10,
"tickCount":{
"signal":"ceil(height/40)"
},
"titleColor":"black",
"labelColor":"black",
"zindex":1
}
],
"legends":[
{
"stroke":"color",
"title":"",
"titleColor":"black",
"labelColor":"black",
"orient":"top-left",
"encode":{
"symbols":{
"name":"legendSymbol",
"interactive":true,
"update":{
"fill":{
"value":"transparent"
},
"strokeWidth":{
"value":2
},
"opacity":[
{
"value":0.7
}
],
"size":{
"value":64
}
}
},
"labels":{
"name":"legendLabel",
"interactive":true,
"update":{
"opacity":[
{
"value":1
}
]
}
}
}
}
],
"config":{
"axisY":{
"minExtent":30
}
}
}
通过使用矩形标记得到修复。
"type":"rect",
"encode":{
"enter":{
"x":{
"scale":"x",
"signal":"x3"
},
"x2":{
"scale":"x",
"signal":"Endtimex3"
},
"y":{
"value":0
},
"y2":{
"signal":"height"
} ,
"fill":{
"value":"red"
},
"stroke":{
"value":"red"
},
"strokeWidth":{
"value":1
},
"fillOpacity":{
"value":1
},
"opacity":{
"value":0.1
}
}
}
}