如何在Vega中基于数据列设置标记的opacity?现有配置未生效
基于数据列设置Vega标记的Opacity值
当然可以基于数据列控制opacity值,你要实现的「c=1时opacity=1,c=0时opacity=0」完全可行。当前代码的逻辑方向没问题,但可以优化写法,确保设置能正确生效。
解决方案
你已经通过facet按c字段分组,每个分组内的datum.c值是统一的(要么全0要么全1),因此可以直接将opacity绑定到c字段——因为c的值正好是0或1,完全匹配opacity的取值范围,写法更简洁:
修改symbol标记的opacity设置:
"opacity": {"field": "c"}
如果偏好保留条件判断的写法,也可以调整为:
"opacity": {"condition": {"test": "datum.c === 0", "value": 0}, "value": 1}
如果希望折线也跟随c值调整透明度,只需在line标记的enter或update块中添加同样的opacity设置即可。
修改后的完整代码
{ "$schema": "https://vega.github.io/schema/vega/v5.json", "description": "A basic line chart example.", "width": 500, "height": 200, "padding": 5, "signals": [ { "name": "interpolate", "value": "linear", "bind": { "input": "select", "options": [ "basis", "cardinal", "catmull-rom", "linear", "monotone", "natural", "step", "step-after", "step-before" ] } } ], "data": [ { "name": "table", "values": [ {"x": 0, "y": 28, "c":0}, {"x": 0, "y": 20, "c":1}, {"x": 1, "y": 43, "c":0}, {"x": 1, "y": 35, "c":1}, {"x": 2, "y": 81, "c":0}, {"x": 2, "y": 10, "c":1}, {"x": 3, "y": 19, "c":0}, {"x": 3, "y": 15, "c":1}, {"x": 4, "y": 52, "c":0}, {"x": 4, "y": 48, "c":1}, {"x": 5, "y": 24, "c":0}, {"x": 5, "y": 28, "c":1}, {"x": 6, "y": 87, "c":0}, {"x": 6, "y": 66, "c":1}, {"x": 7, "y": 17, "c":0}, {"x": 7, "y": 27, "c":1}, {"x": 8, "y": 68, "c":0}, {"x": 8, "y": 16, "c":1}, {"x": 9, "y": 49, "c":0}, {"x": 9, "y": 25, "c":1} ] } ], "scales": [ { "name": "x", "type": "point", "range": "width", "domain": {"data": "table", "field": "x"} }, { "name": "y", "type": "linear", "range": "height", "nice": true, "zero": true, "domain": {"data": "table", "field": "y"} }, { "name": "color", "type": "ordinal", "range": "category", "domain": {"data": "table", "field": "c"} } ], "axes": [ {"orient": "bottom", "scale": "x"}, {"orient": "left", "scale": "y"} ], "marks": [ { "type": "group", "from": { "facet": { "name": "series", "data": "table", "groupby": "c" } }, "marks": [ { "type": "line", "from": {"data": "series"}, "encode": { "enter": { "x": {"scale": "x", "field": "x"}, "y": {"scale": "y", "field": "y"}, "stroke": {"scale": "color", "field": "c"}, "strokeWidth": {"value": 2}, "opacity": {"field": "c"} }, "update": { "interpolate": {"signal": "interpolate"}, "strokeOpacity": {"value": 1} }, "hover": { "strokeOpacity": {"value": 0.5} } } }, { "type": "symbol", "from": {"data": "series"}, "encode": { "enter": { "x": {"scale": "x", "field": "x"}, "y": {"scale": "y", "field": "y"}, "stroke": {"scale": "color", "field": "c"}, "strokeWidth": {"value": 2}, "fill": {"scale": "color", "field": "c"}, "opacity": {"field": "c"} }, "update": { "interpolate": {"signal": "interpolate"}, "strokeOpacity": {"value": 1} }, "hover": { "strokeOpacity": {"value": 0.5} } } } ] } ] }
内容的提问来源于stack exchange,提问作者Osman Mamun
相关产品推荐
相关产品推荐

