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

Vega-Lite中Text Mark基于Brush参数动态显示日期范围的问题

实现基于Brush的日期范围文本展示逻辑

需求说明

我有一个text mark和两个垂直拼接的area mark,每个area都配置了brush参数,其中area 2的brush控制area 1的定义域。需要让text mark按以下逻辑展示过滤后的日期范围:

  • 如果area 1被框选,仅用它作为过滤条件
  • 否则如果area 2被框选,仅用它作为过滤条件
  • 否则显示完整日期范围

当前text mark仅显示完整的毫秒格式日期范围,而area 1使用的"scale": {"domain": {"param": "brush2"}}方案不适用于text mark,需要通过过滤逻辑实现。

解决方案

通过在text mark的transform中引入brush参数、判断有效范围并过滤数据,即可实现需求逻辑。修改后的完整代码如下:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {"url": "data/sp500.csv"},
  "vconcat": [
    {
      "title": "text mark:",
      "width": 480,
      "mark": "text",
      "transform": [
        // 引入两个brush的参数范围
        {"param": ["brush1", "brush2"], "as": ["brush1_range", "brush2_range"]},
        // 判断当前生效的日期范围:优先brush1,其次brush2,否则全量
        {
          "calculate": "brush1_range ? brush1_range.x : (brush2_range ? brush2_range.x : [null, null])",
          "as": "active_range"
        },
        // 根据生效范围过滤数据
        {
          "filter": "active_range[0] === null || (datum.date >= active_range[0] && datum.date <= active_range[1])"
        },
        // 计算过滤后的日期极值
        {
          "joinaggregate": [
            {"op": "min", "field": "date", "as": "min_date"},
            {"op": "max", "field": "date", "as": "max_date"}
          ]
        },
        // 生成日期范围文本
        {
          "calculate": "datum.min_date + ' to ' + datum.max_date",
          "as": "date_range"
        },
        // 去重确保只显示一行文本
        {"distinct": ["date_range"]}
      ],
      "encoding": {
        "text": {"field": "date_range", "type": "nominal"}
      }
    },
    {
      "title": "area mark 1:",
      "width": 480,
      "mark": "area",
      "params": [{
        "name": "brush1",
        "select": {"type": "interval", "encodings": ["x"]}
      }],
      "encoding": {
        "x": {
          "field": "date",
          "type": "temporal",
          "scale": {"domain": {"param": "brush2"}},
          "axis": {"title": ""}
        },
        "y": {"field": "price", "type": "quantitative"}
      }
    }, {
      "title": "area mark 2:",
      "width": 480,
      "height": 60,
      "mark": "area",
      "params": [{
        "name": "brush2",
        "select": {"type": "interval", "encodings": ["x"]}
      }],
      "encoding": {
        "x": {"field": "date", "type": "temporal"},
        "y": {
          "field": "price",
          "type": "quantitative",
          "axis": {"tickCount": 3, "grid": false}
        }
      }
    }
  ]
}

关键逻辑说明

  1. 引入参数:通过param转换步骤获取两个brush的选中范围,存储为brush1_range和brush2_range
  2. 优先级判断:用calculate实现需求中的优先级逻辑,确定当前生效的日期范围active_range
  3. 数据过滤:根据active_range过滤数据集,仅保留范围内的日期数据
  4. 计算极值:对过滤后的数据计算最小/最大日期,生成展示文本
  5. 去重处理:添加distinct转换确保text mark只显示一行结果

日期格式转换技巧(非核心需求)

如果需要将毫秒格式的日期转换为更友好的字符串,可以使用Vega的datetimeFormat函数修改date_range的计算逻辑:

{
  "calculate": "datetimeFormat(datum.min_date, '%Y-%m-%d') + ' to ' + datetimeFormat(datum.max_date, '%Y-%m-%d')",
  "as": "date_range"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:47:09