Как работать с примитивными значениями во встроенных данных?

В целом, встроенные данные в vega-lite должны иметь такую ​​форму:

"data": {
  "values": [
    {"first column": "A", "second column": 28, "third column": 32}, 
    {"first column": "B", "second column": 55, "third column": 94}, 
    {"first column": "C", "second column": 43, "third column": 21},
    ...
  ]
}

Я пытаюсь выяснить, могут ли inline-данные быть определены более кратко, "транспонируя" данные. Это позволит избежать чрезмерного повторения имен полей, то есть:

"data": {
  "values": [
    {"first column": ["A", "B", "C"]}, 
    {"second column": [28, 55, 43]}, 
    {"third column": [32, 94, 21]},
    ...
  ]
}

В документации по встроенным данным смутно упоминается values поле:

Это может быть массив объектов или примитивных значений или строка. Массивы примитивных значений принимаются как объекты со свойством данных.

Так что все, что я могу сделать, это, например, "values": ["A", "B", "C"],

Как я могу использовать такие примитивные встроенные данные? Данные имеют только одно поле data, которого недостаточно для построения на оси x + y. Есть также автоматически сгенерированный id поле, которое можно использовать в кодировке оси? Или можно объединить несколько примитивных встроенных наборов данных в набор данных с несколькими (именованными) полями?

Возможен ли компактный вариант данных со стандартным vega?

2 ответа

После объединения https://github.com/vega/vega-lite/pull/3822 вы можете использовать для этого преобразование flatten. См. https://vega.github.io/vega/docs/transforms/flatten/ для получения эквивалента Vega.

вход

[
  {"key": "alpha", "foo": [1, 2],    "bar": ["A", "B"]},
  {"key": "beta",  "foo": [3, 4, 5], "bar": ["C", "D"]}
]

Выход

[
  {"key": "alpha", "foo": 1, "bar": "A"},
  {"key": "alpha", "foo": 2, "bar": "B"},
  {"key": "beta",  "foo": 3, "bar": "C"},
  {"key": "beta",  "foo": 4, "bar": "D"},
  {"key": "beta",  "foo": 5, "bar": null}
]

Вы можете использовать сжатые данные, но сначала вам нужно их расширить. Информация о конфигурации для vega-lite - это просто javascript, поэтому вы можете использовать такую ​​функцию:

  expand_data = compressed => {
  const expanded = [];
  const keys = compressed.map( r => Object.keys(r)[0]);
  const keys_count = compressed.length; 
  const row_count = compressed[0][keys[0]].length;
  for (let i = 0; i< row_count; i++) {
    const new_row = {};
    for (let j = 0; j < keys_count; j++) {
      new_row[keys[j]] = compressed[j][keys[j]][i]
    }
    expanded.push(new_row);
  }
  return expanded;
}

взять данные из сжатых встроенных данных в версию данных, которую ожидает vega-lite.

Смотрите рабочий пример, который я создал:

https://beta.observablehq.com/@jjimenez/using-different-data-formats-with-vega-lite

Когда они говорят, что "массивы примитивных объектов принимаются как объекты со свойством данных", я думаю, что они имеют в виду следующий код:

let apple = { label: 'apple', data: { size: 'small', weight: 12, color: 'red'} };
let orange = { label: 'orange', data: {size: 'small', weight: 13, color: 'orange'}};
let melon = {label: 'melon', data: {size: 'large', weight: 50, color: 'green' }};

... значения: [яблоко, апельсин, дыня]

яблоко, апельсин и дыня также могут иметь другие свойства или функции.

Я добавил диаграмму приматов в блокнот.

Другие вопросы по тегам