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

如何在Vega-Lite可视化中添加表示时间跨度的竖线括号?

在Vega-Lite中添加日期区间标记(竖线+括号)

要实现你需要的效果,核心思路是通过**图层(layer)**在散点图和回归线上叠加竖线与区间标注,具体实现如下:

1. 计算最近三周的日期范围

先通过数据转换逻辑算出区间的起始和结束日期。如果基于当前时间计算,用now()结合日期偏移得到起始日期;如果基于数据中的最新日期,就用数据的最大日期做偏移。示例转换规则:

"transform": [
  {"calculate": "now()", "as": "end_date"},
  {"calculate": "datetime(year(now()), month(now()), date(now()) - 21)", "as": "start_date"}
]

如果用数据最新日期:

"transform": [
  {"aggregate": [{"op": "max", "field": "date", "as": "end_date"}]},
  {"calculate": "datetime(year(datum.end_date), month(datum.end_date), date(datum.end_date) - 21)", "as": "start_date"}
]

2. 添加区间竖线

用rule标记绘制左右两条竖线,绑定x轴为计算出的起始/结束日期,y轴覆盖整个图表范围:

{
  "mark": "rule",
  "encoding": {
    "x": {"field": "start_date", "type": "temporal"},
    "color": {"value": "#ff5252"},
    "size": {"value": 2}
  }
},
{
  "mark": "rule",
  "encoding": {
    "x": {"field": "end_date", "type": "temporal"},
    "color": {"value": "#ff5252"},
    "size": {"value": 2}
  }
}

3. 添加括号式标注

有两种方式实现括号效果,按需选择:

方式一:文本括号+说明

用text标记在竖线顶部添加括号符号和区间说明,简单直观:

{
  "mark": {"type": "text", "y": -10, "align": "center"},
  "encoding": {
    "x": {"field": "start_date", "type": "temporal"},
    "text": {"value": "["},
    "color": {"value": "#ff5252"},
    "size": {"value": 20}
  }
},
{
  "mark": {"type": "text", "y": -10, "align": "center"},
  "encoding": {
    "x": {"field": "end_date", "type": "temporal"},
    "text": {"value": "]"},
    "color": {"value": "#ff5252"},
    "size": {"value": 20}
  }
},
{
  "mark": {"type": "text", "y": -30, "align": "center"},
  "encoding": {
    "x": {"aggregate": "mean", "field": "start_date", "type": "temporal"},
    "text": {"value": "最近三周"},
    "color": {"value": "#333"},
    "size": {"value": 14}
  }
}

方式二:线条式括号

如果需要更贴合的线条括号,用line标记结合数据转换生成路径:

{
  "mark": {"type": "line", "stroke": "#ff5252", "strokeWidth": 2},
  "transform": [
    {"calculate": "datum.start_date", "as": "x"},
    {"calculate": "0", "as": "y_top"},
    {"calculate": "20", "as": "y_mid"},
    {"fold": ["y_top", "y_mid"], "as": ["y_type", "y"]}
  ],
  "encoding": {
    "x": {"field": "x", "type": "temporal"},
    "y": {"field": "y", "type": "quantitative"},
    "path": {"field": "y_type", "type": "nominal"}
  }
},
{
  "mark": {"type": "line", "stroke": "#ff5252", "strokeWidth": 2},
  "transform": [
    {"calculate": "datum.end_date", "as": "x"},
    {"calculate": "0", "as": "y_top"},
    {"calculate": "20", "as": "y_mid"},
    {"fold": ["y_top", "y_mid"], "as": ["y_type", "y"]}
  ],
  "encoding": {
    "x": {"field": "x", "type": "temporal"},
    "y": {"field": "y", "type": "quantitative"},
    "path": {"field": "y_type", "type": "nominal"}
  }
}

完整整合示例

把以上部分和你的散点图、回归线整合到一个图层配置中:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {"url": "你的数据源路径"}, // 替换为实际数据源
  "transform": [
    {"calculate": "now()", "as": "end_date"},
    {"calculate": "datetime(year(now()), month(now()), date(now()) - 21)", "as": "start_date"}
  ],
  "layer": [
    // 散点图
    {
      "mark": "point",
      "encoding": {
        "x": {"field": "date", "type": "temporal"},
        "y": {"field": "value", "type": "quantitative"}
      }
    },
    // 回归线
    {
      "mark": "line",
      "transform": [{"regression": "value", "on": "date"}],
      "encoding": {
        "x": {"field": "date", "type": "temporal"},
        "y": {"field": "value", "type": "quantitative"},
        "color": {"value": "#42a5f5"}
      }
    },
    // 区间竖线
    {
      "mark": "rule",
      "encoding": {
        "x": {"field": "start_date", "type": "temporal"},
        "color": {"value": "#ff5252"},
        "size": {"value": 2}
      }
    },
    {
      "mark": "rule",
      "encoding": {
        "x": {"field": "end_date", "type": "temporal"},
        "color": {"value": "#ff5252"},
        "size": {"value": 2}
      }
    },
    // 文本括号与标注
    {
      "mark": {"type": "text", "y": -10, "align": "center"},
      "encoding": {
        "x": {"field": "start_date", "type": "temporal"},
        "text": {"value": "["},
        "color": {"value": "#ff5252"},
        "size": {"value": 20}
      }
    },
    {
      "mark": {"type": "text", "y": -10, "align": "center"},
      "encoding": {
        "x": {"field": "end_date", "type": "temporal"},
        "text": {"value": "]"},
        "color": {"value": "#ff5252"},
        "size": {"value": 20}
      }
    },
    {
      "mark": {"type": "text", "y": -30, "align": "center"},
      "encoding": {
        "x": {"aggregate": "mean", "field": "start_date", "type": "temporal"},
        "text": {"value": "最近三周"},
        "color": {"value": "#333"},
        "size": {"value": 14}
      }
    }
  ],
  "config": {"axis": {"grid": true}}
}

调整提示

  • 修改y值可以改变括号和文本的垂直位置,适配你的图表布局。
  • 颜色、线条粗细、文本大小等样式可以根据仪表板风格自定义。
  • 如果数据日期格式特殊,可能需要调整datetime函数的参数适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:38