Vega Lite计算问题

时间:2020-03-14 14:10:24

标签: vega-lite

我正在尝试创建一个图形,该图形显示从csv文件中许多现有列计算出的新列值。我知道还有更多的国家,而且每个国家/地区的得分都超过10(每个领域),因此满分为50。

     {
  "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
  "data": {
    "url": "https://raw.githubusercontent.com/Anika6138/InfoVis/master/arabica_data_cleaned.csv",
    "format": {
      "type": "csv"
    }
  },
  "transform": [
   {"calculate": "datum.Aroma + datum.Flavor + datum.Aftertaste + datum.Acidity + datum.Sweetness  ", "as": "Taste_Points"}
  ],
      "mark": "bar",
      "encoding": {
        "y": {
          "field": "Country_of_Origin",
          "type": "nominal"
        },
        "x": {
          "field": "Taste_Points",
          "type": "quantitative"
        }
  },
  "config": {}
}

enter image description here

这就是我得到的。许多具有值的国家/地区会被忽略,并且未添加任何过滤器。

1 个答案:

答案 0 :(得分:1)

您的数据被指定为CSV,这意味着计算中的所有值都将解释为字符串,除非您另外指定。有两种方法可以解决此问题;您可以在data format定义中添加parse语句:

  "data": {
    "url": "https://raw.githubusercontent.com/Anika6138/InfoVis/master/arabica_data_cleaned.csv",
    "format": {
      "type": "csv",
      "parse": {"Aroma": "number", "Flavor": "number", "Aftertaste": "number", "Acidity": "number", "Sweetness": "number"}
    }
  }

或者您可以在计算表达式中使用parseFloat

  "transform": [
    {
      "calculate": "parseFloat(datum.Aroma) + parseFloat(datum.Flavor) + parseFloat(datum.Aftertaste) + parseFloat(datum.Acidity) + parseFloat(datum.Sweetness)",
      "as": "Taste_Points"
    }
  ]

在原始规范中隐式过滤字段的原因是,在许多情况下,总和的结果是一个无法解析为有效数字的级联字符串,并且从定量编码中隐式删除了NaN值;例如:

{
  "data": {
    "values": [
      {"y": "A", "x": 1},
      {"y": "B", "x": 2},
      {"y": "C", "x": null},
      {"y": "D", "x": null}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "x", "type": "quantitative"},
    "y": {"field": "y", "type": "ordinal"}
  }
}

enter image description here