Как работать с примитивными значениями во встроенных данных?
В целом, встроенные данные в 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' }};
... значения: [яблоко, апельсин, дыня]
яблоко, апельсин и дыня также могут иметь другие свойства или функции.
Я добавил диаграмму приматов в блокнот.