выдает преобразующую строку в дату vega lite - PullRequest
1 голос
/ 24 марта 2020

Я новичок в Vega-Lite и пытаюсь отобразить некоторые данные в виде линейного графика, однако мои данные "Harvest_Year", представляющие собой даты в годах, например, 2017, 2018, отображаются в виде строки, которую я считаю.

Я импортировал данные из файла .csv, и ниже приведены шаги, которые я предпринял, чтобы изменить строку на формат даты. Я устал делать:

"Harvest_Year": "year"

Но это не сработало, так как все мои значения обнулялись. Поэтому я подумал, что сначала я сделаю это int, а затем преобразую его в год. Тем не менее, в Vega-Lite все мои годы правильно отображаются в таблице, но когда я отображаю их на линейном графике, я вижу только 1970 год, которого, я уверен, у меня нет в наборе данных, и он отображает только этот единственный год.

line graph displaying only one year

где, как на изображении ниже, вы можете видеть, что у меня есть все годы в моих данных:

correct data

{
  "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
  "data": {
    "url": "https://raw.githubusercontent.com/DanStein91/Info-vis/master/CoffeeRobN.csv",
    "format": {
      "type": "csv",
            "parse": {
       "Number_of_Bags": "number",
        "Bag_weight": "number",
        "Harvest_Year": "number"
      }
    }
  },
  "transform": [
{
    "timeUnit": "year",
    "field": "Harvest_Year",
    "as": "Year"
  },
     {
      "calculate": "datum.Number_of_Bags * datum.Bag_Weight ",
      "as": "Total_Export"
    }
  ],  
      "width": 300,
      "height": 200,
  "mark": "line",
  "encoding": {

    "y": {
      "field": "Total_Export",
      "type": "quantitative"
    },
    "x": {
      "field": "Harvest_Year",
      "type": "temporal"
    }
  },
  "config": {}
}

Любая помощь приветствуется, спасибо.

1 Ответ

0 голосов
/ 24 марта 2020

Когда вы указываете vega-lite интерпретировать числа как даты, он обрабатывает их как unix отметок времени, то есть миллисекунды после 1 января 1970 года. Каждая из полученных вами дат относится к 1970 году, что приводит к диаграмме, которую вы видите .

Ваши даты выглядят в нестандартном формате (например, "2017.0" означает год 2017), поэтому вам придется использовать выражения vega , чтобы вручную разобрать их в объекты даты , Вот пример этого ( представление в редакторе ):

{
  "data": {
    "url": "https://raw.githubusercontent.com/DanStein91/Info-vis/master/CoffeeRobN.csv",
    "format": {
      "type": "csv",
      "parse": {
        "Number_of_Bags": "number",
        "Bag_weight": "number",
        "Harvest_Year": "number"
      }
    }
  },
  "transform": [
    {"filter": "isValid(datum.Harvest_Year)"},
    {"calculate": "datetime(datum.Harvest_Year, 1)", "as": "Harvest_Year"},
    {
      "calculate": "datum.Number_of_Bags * datum.Bag_Weight ",
      "as": "Total_Export"
    }
  ],
  "mark": "point",
  "encoding": {
    "y": {"field": "Total_Export", "type": "quantitative"},
    "x": {"field": "Harvest_Year", "type": "ordinal", "timeUnit": "year"}
  },
  "width": 300,
  "height": 200
}

enter image description here

Другой вариант - избежать datetime и timeUnit logi c в целом (поскольку ваши данные на самом деле не содержат никаких дат), и просто используйте номера года непосредственно в вашей кодировке; например,

{
  "data": {
    "url": "https://raw.githubusercontent.com/DanStein91/Info-vis/master/CoffeeRobN.csv",
    "format": {
      "type": "csv",
      "parse": {
        "Number_of_Bags": "number",
        "Bag_weight": "number",
        "Harvest_Year": "number"
      }
    }
  },
  "transform": [
    {"filter": "isValid(datum.Harvest_Year)"},
    {
      "calculate": "datum.Number_of_Bags * datum.Bag_Weight ",
      "as": "Total_Export"
    }
  ],
  "mark": "point",
  "encoding": {
    "y": {"field": "Total_Export", "type": "quantitative"},
    "x": {"field": "Harvest_Year", "type": "ordinal"}
  },
  "width": 300,
  "height": 200
}
...