Как кодировать табличные данные в Vega-Lite?

Прежде всего, трудно описать, что я имею в виду под «данными на основе таблиц», потому что в некотором смысле все входные данные для 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. Как я могу кодировать данные на основе таблицы в одну цветную многолинейную диаграмму?

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

"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?


person theofred    schedule 09.02.2019    source источник


Ответы (2)


Данные, с которыми работает 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 transform, который предназначен для преобразования данных, ориентированных на строки, в данные, ориентированные на столбцы, в спецификации диаграммы.

Так, в 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"}
  }
}

введите здесь описание изображения

person jakevdp    schedule 09.02.2019
comment
Большое спасибо! Также очень полезны пояснения к формам данных. У меня в голове была картинка из форм базы данных, но я не мог вспомнить правильные термины. - person theofred; 10.02.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"}
    }
  }]
}

введите здесь описание изображения

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

person kanitw    schedule 10.03.2019