vega-lite - 基于选择动态改变编码中的 Y 轴字段 Vega-Lite

标签 vega-lite vega

如何根据选择动态更改为 y 轴编码的数据字段?我正在尝试构建一个可视化来显示一天 24 小时内的事件计数数据,并且希望用户能够选择不同的时区(例如 EST、CST、MST 或 PST)。

为此,我构建了一个选择,在其中指定上面括号中列出的所有选项,并将 EST 设置为默认值。我想创建一个条件,当我选择 EST 之外的另一个选项时,我会看到可视化动态更新。我已经探索过专门为这些时间范围创建其他小时字段,或者添加条件逻辑来尝试考虑这些动态变化,但我还没有找到一个好的解决方案。有人可以帮忙吗?

这是我的几行数据的示例

"data": {
      "values": [
        {
          "title_column":"example",
          "Type": "Technology",
          "Events": "100",
          "Hour": "0",
          "Date": "9/1/20",
          "Time Period": "Last Time"
        },
        {
          "title_column":"example",
          "Type": "Technology",
          "Events": "110",
          "Hour": "1",
          "Date": "9/1/20",
          "Time Period": "Last Time"
        },

可视化组合在一起时看起来像这样,并根据选择动态更新:

Time of Day Image

当我的代码是静态的时,它看起来像这样:

    "layer":[
           {"mark":{
               "type":"bar",
               "point":true,
               "color":"#FFC94E",
               "height":15
           },
           "selection": {
        "timezone": {
          "type": "single",
          "init": {"changer": "EST"},
          "bind": {
            "changer": {"input": "select",
              "options": ["EST","CST (-1 Hour)","MST (-2 Hours)","PST (-3 Hours)"]}
          }
        }
      },
    "encoding":
        {
            "x":{"field":"Events",
            "type":"quantitative",
            "aggregate":"sum",
            "axis":null},
            "y": {"field":"Hour",
            "type":"ordinal",
            "axis":{
              "labelSeparation":1,
              "labelPadding":4,
              "title":null
            }
            }
        }}]
        }

但是,特别关注代码底部的 y 编码,我理想地希望使其动态化。我想我可以为每个时区创建计算,然后编写一个如下所示的条件,但我无法让它发挥作用。非常感谢任何帮助!

"y": {
            "condition": { 
            "selection": {"timezone" : "EST"},
            "datum": "datum.Hour"
              }
            "condition": { 
            "selection": {"timezone" : "CST (-1 Hour)"},
            "datum": "datum.Hour_CST"
              }
              ...
            }

这是我的代码的链接: vega editor .

最佳答案

选择只能过滤列值,不能过滤列名称。幸运的是,您可以使用 Fold Transform 将列名称转换为列值。 .

为了实现您想要的目标,我建议执行以下操作:

  • 使用一系列 Calculate Transforms计算包含您要显示的值的新列。
  • 使用 Fold Transform将这些值堆叠到具有关联键列的单个列中。
  • 将选择绑定(bind)链接到折叠转换中创建的键列。
  • 使用 Filter Transform根据选择过滤值
  • 最后,添加行编码,以便在轴上标记所选列。

放在一起,看起来像这样(open in vega editor):

{
  "width": 300,
  "data": {
    "values": [...]
  },
  "transform": [
    {"filter": {"field": "Time Period", "equal": "Last Time"}},
    {"calculate": "datum.Hour - 0", "as": "EST"},
    {"calculate": "datum.Hour - 1", "as": "CST (-1 Hour)"},
    {"calculate": "datum.Hour - 2", "as": "MST (-2 Hours)"},
    {"calculate": "datum.Hour - 3", "as": "PST (-3 Hours)"},
    {
      "fold": ["EST", "CST (-1 Hour)", "MST (-2 Hours)", "PST (-3 Hours)"],
      "as": ["Zone", "Hour"]
    },
    {"filter": {"selection": "timezone"}}
  ],
  "selection": {
    "timezone": {
      "type": "single",
      "init": {"Zone": "EST"},
      "bind": {
        "Zone": {
          "name": "timezone",
          "input": "select",
          "options": [
            "EST",
            "CST (-1 Hour)",
            "MST (-2 Hours)",
            "PST (-3 Hours)"
          ]
        }
      }
    }
  },
  "mark": {"type": "bar", "point": true, "color": "#FFC94E", "height": 15},
  "encoding": {
    "x": {
      "field": "Events",
      "type": "quantitative",
      "aggregate": "sum",
      "axis": null
    },
    "y": {
      "field": "Hour",
      "type": "ordinal",
      "axis": {"labelSeparation": 1, "labelPadding": 4, "title": null}
    },
    "row": {
      "field": "Zone",
      "type": "nominal",
      "title": null
    }
  }
}

enter image description here

关于vega-lite - 基于选择动态改变编码中的 Y 轴字段 Vega-Lite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64449715/

相关文章:

d3.js - 使用 Vega 生成 3D 曲面图?

vega - 将 Vega 交互式可视化导出到 PowerPoint 的简单方法(并保持交互性)

json - Deneb 可视面积图 Power BI

python - Altair/Vega-Lite 条形图 : filter top K bars from aggregated field

Python Altair 根据选择生成表格

python - 分层图表从一张图表中删除标记

Vegalite 日线图摆动

Vega-Lite 图表 x 轴显示不显示新年开始后的月份

elasticsearch - 查看Vega + Kibana中不是 `doc_count`的所有内容

vega-lite - 如何在单行显示中组合文本和字段值