Как кодировать данные на основе таблиц в Vega-Lite? - PullRequest
0 голосов
/ 10 февраля 2019

Прежде всего, сложно описать то, что я имею в виду под «табличными данными», потому что в некотором смысле все входные данные для vega - это «таблица-иш», но этот пример должен прояснить:

Большинство (если не все) из Vega-Lite примеров для многострочных диаграмм используют такие данные, как

"data": {
  "values": [
    {"id": 0, "symbol": "A", "value": 4},
    {"id": 1, "symbol": "A", "value": 2},
    {"id": 0, "symbol": "B", "value": 3},
    {"id": 1, "symbol": "B", "value": 8}
  ]
}

, которые просто окрашивают линии Aи B с таким кодированием,

"mark": "line",
"encoding": {
  "x": {"field": "id", "type": "quantitative"},
  "y": {"field": "value", "type": "quantitative"},
  "color": {"field": "symbol", "type": "nominal"}
}

Но что, если я хочу получить тот же результат с табличной формой данных, подобной этой,

"data": {
  "values": [
    {"id": 0, "A": 4, "B": 3},
    {"id": 1, "A": 2, "B": 8}
  ]
}

1.Как я могу кодировать данные на основе таблиц в одну цветную многострочную диаграмму?

Базовое кодирование может заключаться в создании линейных диаграмм для каждого поля и наложении их друг на друга, как this ,

"encoding": {
      "x": {"field": "id", "type": "quantitative"}
  },
  "layer": [
    {
      "mark": "line",
      "encoding": {
        "y": {"field": "A", "type": "quantitative"}
      }
    },
    {
      "mark": "line",
      "encoding": {
        "y": {"field": "B", "type": "quantitative"}
      }
    }
  ]

Но при этом я не знаю, как по-разному раскрасить линии или как создать легенду.

2.Является ли этот тип входных данных идиоматичным по отношению к тому, как спроектирован vega / vega-lite?

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Другое решение (немного утомительное) - использовать слой и создать n слоев для n столбцов

{
  "$schema": "https://vega.github.io/schema/vega-lite/v3.json",
  "data": {"url": "data/seattle-weather.csv", "format": {"type": "csv"}},
  "layer": [{
    "mark": {"type": "line", "color": "orange"},
    "encoding": {
      "x": {"timeUnit": "yearmonthdate", "field": "date", "type": "temporal"},
      "y": {"field": "temp_max", "type": "quantitative"}
    }
  }, {
    "mark": {"type": "line", "color": "red"},
    "encoding": {
      "x": {"timeUnit": "yearmonthdate", "field": "date", "type": "temporal"},
      "y": {"field": "temp_min", "type": "quantitative"}
    }
  }]
}

enter image description here

Будущая поддержка повторения слоя(https://github.com/vega/vega-lite/issues/1274) может сделать это более разумным решением.

0 голосов
/ 10 февраля 2019

Данные, с которыми работает vega-lite, часто называют «длинными данными» или «ориентированными на столбцы» данными.Тип запрашиваемых данных часто называют «широкоформатными» или «ориентированными на строки» данными.Это кратко обсуждается в документации для Altair, оболочки Python для vega-lite: https://altair -viz.github.io / user_guide / data.html # long-form-vs-wide-form-data

В текущем выпуске Vega-Lite (v2.X) единственным вариантом является изменение источника данных для ориентации на столбцы с помощью внешнего инструмента.Это изменится в выпуске Vega-Lite v3.0, в котором добавлено преобразование Fold , предназначенное для преобразования ориентированных на строки данных в ориентированные на столбцы в спецификации диаграммы.

Итакв Vega-Lite 3 вы можете использовать преобразование сгиба следующим образом ( ссылка редактора vega ):

{
  "data": {"values": [{"id": 0, "A": 4, "B": 3}, {"id": 1, "A": 2, "B": 8}]},
  "transform": [{"fold": ["A", "B"]}],
  "mark": "line",
  "encoding": {
    "x": {"field": "id", "type": "quantitative"},
    "y": {"field": "value", "type": "quantitative"},
    "color": {"field": "key", "type": "nominal"}
  }
}

enter image description here

...