【问题标题】:Vega-Lite Calculated Scale domainMaxVega-Lite Calculated Scale 域最大
【发布时间】:2022-12-03 03:46:20
【问题描述】:

我正在尝试在 Y 轴刻度上计算 domainMax 的值。我尝试了以下示例,其中我希望 Y 轴 domainMax 比名为“value”的数据集字段中的最大值大 1。该示例产生错误“无法识别的信号名称:“domMax””。我怎样才能让它工作?

{
  "data": {
    "values": [
      {"date": "2021-03-01T00:00:00", "value": 1},
      {"date": "2021-04-01T00:00:00", "value": 3},
      {"date": "2021-05-01T00:00:00", "value": 2}
    ]
  },
  "transform": [
    { "calculate": "max(datum.value)+1","as": "domMax"}
  ],
  "mark": "line",
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal"
    },
    "y": {"field": "value", "type": "quantitative",
      "scale": {"domainMax": {"expr": "domMax"}}
    }
  }
}

【问题讨论】:

    标签: vega-lite yaxis


    【解决方案1】:
    1. 这种转变

      "transform": [
          { "calculate": "max(datum.value)+1","as": "domMax"}
       ]
      

      向您的数据集添加一个新列 - 它不会创建新信号。您可以查看in the editor。前往数据查看器选项卡并选择数据_0从下拉。你能看到新的吗domMax柱子?

      1. 信号是完全不同的东西——看看文档中的here。请注意,该链接指向 Vega,而不是 Vega-Lite。 (Vega-Lite 规范被编译为 Vega。)

      2. Vega-Lite 不允许您声明信号;您改为声明参数。这是使用domMax参数的another example。 Vega-Lite 参数被转换为 Vega 信号。

      3. 看起来您正在尝试从数据中导出参数/信号的值。我不确定您是否可以在 Vega-Lite 中做到这一点。

      4. 另一方面,这在 Vega 中非常容易。例如,您可以使用范围变换: https://vega.github.io/vega/docs/transforms/extent/

      旁注——虽然 Vega 规范更为冗长,但您有时会发现它们的原语更简单,并且是理解可视化工作原理的好方法。 (您可以在编辑器中看到编译后的 Vega。)

    【讨论】:

    • 感谢您的出色解释和示例。尽管它没有解决问题,但它是非常有用的信息,我学到了很多东西并且会避免在我所走的道路上浪费时间。
    【解决方案2】:

    我试图根据数据获取自定义域,但遇到了与您相同的限制。

    就我而言,我从外部更新数据有点像the streaming example。我从外部计算域并在可视化中使用参数修改它们。这很容易,因为 vega-lite 参数作为 vega 信号公开。

    这是布局的要点:

      {
        "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
        "params": [
          {
            "name": "lowBound",
            "value": -10
          },
          {
            "name": "highBound",
            "value": 100
          }
        ],
        ../..
        "vconcat": [
          {
            "name": "detailed",
            ../..
            "layer": [
              { 
                ../..
                "mark": "line",
                "encoding": {
                  "y": {
                    "field": "value",
                    "title": "Temperature",
                    "type": "quantitative",
                    "scale": {
                      "domainMin": {
                        "expr": "lowBound"
                      },
                      "domainMax": {
                        "expr": "highBound"
                      }
                    }
                  },
    ...
    

    lowBoundhighBound通过vega信号动态变化。我用常规的 JS API 更改它们。

    【讨论】:

    • 感谢您提供此提示。我仍然没有解决我的问题,但这个建议有助于指导我使用范围输入参数。我正在使用 Power BI Deneb 控件并有一个多层图表,我认为将参数放在层数组之外时会出现问题。当我将参数放在图层中时,图表无法呈现。此外,由于需要信号与数据集列的原始问题,我还没有找到从 Deneb 控件外部传递计算值的方法。仍在尝试...
    • 我对 Power BI 一无所知,所以我无法在这方面提供帮助。但如果有帮助,我还有一个多层图,它似乎可以工作。我将编辑我的答案以显示我使用的结构。
    【解决方案3】:

    如果您的硬编码值不理想,您可以将参数添加到 pan and zoom

    "params": [{"name": "grid", "select": "interval", "bind": "scales"}],

    Open the Chart in the Vega Editor

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2020-03-19
      • 2019-11-12
      • 2019-06-02
      • 2020-04-22
      • 1970-01-01
      • 2020-08-13
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多