You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态X轴范围下Vega-Lite中Rule Mark连续值连接实现方案

实现Vega-Lite底部连续高亮线段

需求是在图表底部,当价格超过400时显示连续的红色线段,且X轴动态缩放时线段始终保持连接。原方案用rule mark会因数据点间隔导致线段断开,调整strokeWidth无法适配所有缩放场景。

解决思路

核心是将连续满足price>400的日期区间合并,直接绘制整个区间的线段,而非为每个数据点单独生成短rule。通过Vega-Lite的变换功能识别连续区间的起始和结束点,再用rule mark绘制跨区间的线段。

修改后的代码

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "Google's stock price over time with continuous bottom highlight line.",
  "data": {"url": "data/stocks.csv"},
  "transform": [
    {"filter": "datum.symbol==='GOOG'"},
    {"filter": {"timeUnit": "year", "field": "date", "lte": "2007"}},
    {"filter": {"timeUnit": "year", "field": "date", "gte": "2005"}}
  ],
  "encoding": {"x": {"field": "date", "type": "temporal"}},
  "layer": [
    {
      "mark": "area",
      "encoding": {"y": {"field": "price", "type": "quantitative"}}
    },
    {
      "transform": [
        {"calculate": "datum.price > 400 ? 1 : 0", "as": "high_price"},
        // 标记当前点是否与前一个点连续满足条件
        {"window": [{"field": "high_price", "op": "lag", "as": "prev_high"}], "frame": [-1, 0]},
        // 标记区间起始点:当前满足条件且前一个不满足,或当前是第一个满足条件的点
        {"calculate": "(datum.high_price === 1 && (datum.prev_high === 0 || datum.prev_high === null)) ? 1 : 0", "as": "is_start"},
        // 为每个起始点匹配对应的结束日期
        {"window": [{"field": "date", "op": "lead", "as": "end_date"}], "frame": [0, 0], "groupby": []},
        // 筛选出起始点,并补充结束点:下一个不满足条件的点的日期,或最后一个点的日期
        {"filter": "datum.is_start === 1"},
        {"calculate": "datum.end_date === null ? datum.date : datum.end_date", "as": "end_date"}
      ],
      "mark": {"type": "rule", "strokeWidth": 6, "color": "red"},
      "encoding": {
        "x": {"field": "date", "type": "temporal"},
        "x2": {"field": "end_date", "type": "temporal"},
        "y": {"value": 201},
        "y2": {"value": 195}
      }
    }
  ]
}

代码说明

  • high_price计算:标记每个数据点是否满足价格超过400的条件
  • prev_high窗口变换:获取前一个点的high_price值,用于判断连续区间的起始
  • is_start计算:识别连续满足条件区间的第一个点
  • end_date窗口变换:为每个起始点找到下一个不满足条件点的日期,作为区间结束
  • rule标记绘制:基于起始和结束日期绘制跨区间的线段,确保无论X轴如何缩放,整个区间的线段始终连续

内容的提问来源于stack exchange,提问作者Vlad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:04:53