Работать вокруг, чтобы отобразить график vega-lite на основе столбца периода времени?

Я задаю этот вопрос в ответ на: Исходный вопрос

Основное требование очень простое: отображать результаты спортивных соревнований на графике на основе удобочитаемого периода времени. Например, 8 лучших мужчин на 800 м из Рио-2016.

Rank    Name                    Time
1   David Lekuta Rudisha        1:42.15 
2   Taoufik Makhloufi       1:42.61 
3   Clayton Murphy          1:42.93 
4   Pierre-Ambroise Bosse       1:43.41 
5   Ferguson Cheruiyot Rotich   1:43.55 
6   Marcin Lewandowski      1:44.20 
7   Alfred Kipketer         1:46.02 
8   Boris Berian            1:46.15

Возникли некоторые проблемы, такие как: Нулевая точка для метки времени не определена должным образом, поэтому столбик не подходит для временных данных.

Я буду признателен за любой обходной путь для отображения результатов за период времени для решения такой проблемы.

Спасибо Йоав


person Yoav Ben Moha    schedule 29.01.2020    source источник


Ответы (1)


Vega-lite не имеет собственного типа данных для представления периодов времени, он имеет только тип данных, представляющий временные метки. При использовании полосовых меток для временных меток нулевая точка зависит от контекста, поэтому Vega-Lite не будет пытаться вывести ее за вас.

Для ваших данных я бы, вероятно, подошел к нему следующим образом:

  • Используйте аргумент parse в ваших данных, чтобы указать ожидаемый формат ваших временных меток, как в исходном вопросе.
  • Используйте timeUnit преобразование, чтобы вручную вычислить соответствующую нулевую точку для ваших данных: здесь yearmonthdate timeUnit работает хорошо, потому что он удаляет часы, минуты и секунды.
  • Используйте кодировку y2 в своей полосе, чтобы указать эту нулевую точку для отметки полосы.

Соединенный, результат может выглядеть примерно так (Редактор Vega):

{
  "data": {
    "values": [
      {"Rank": 1, "Name": "David Lekuta Rudisha", "Time": "1:42.15"},
      {"Rank": 2, "Name": "Taoufik Makhloufi", "Time": "1:42.61"},
      {"Rank": 3, "Name": "Clayton Murphy", "Time": "1:42.93"},
      {"Rank": 4, "Name": "Pierre-Ambroise Bosse", "Time": "1:43.41"},
      {"Rank": 5, "Name": "Ferguson Cheruiyot Rotich", "Time": "1:43.55"},
      {"Rank": 6, "Name": "Marcin Lewandowski", "Time": "1:44.20"},
      {"Rank": 7, "Name": "Alfred Kipketer", "Time": "1:46.02"},
      {"Rank": 8, "Name": "Boris Berian", "Time": "1:46.15"}
    ],
    "format": {"parse": {"Time": "date:'%M:%S.%L'"}}
  },
  "transform": [
    {"timeUnit": "yearmonthdate", "field": "Time", "as": "zeropoint"}
  ],
  "mark": "bar",
  "encoding": {
    "x": {"field": "Name", "type": "nominal"},
    "y": {
      "field": "Time",
      "timeUnit": "minutessecondsmilliseconds",
      "type": "temporal",
      "title": "Time"
    },
    "y2": {"field": "zeropoint", "timeUnit": "minutessecondsmilliseconds"}
  },
  "$schema": "https://vega.github.io/schema/vega-lite/v4.0.0.json"
}

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

person jakevdp    schedule 29.01.2020
comment
Очень элегантное решение! Есть ли причина, по которой я получаю следующее ПРЕДУПРЕЖДЕНИЕ, [Предупреждение] Проверка: / encoding / y / timeUnit должно быть равно одному из допустимых значений - person Yoav Ben Moha; 29.01.2020
comment
Иногда проверка схемы более строгая, чем средство визуализации. - person jakevdp; 29.01.2020
comment
Мне не удалось отсортировать результаты по полю времени. Не помогло следующее: sort: {field: Time}. Есть ли у вас какие-либо предложения, как упорядочить результаты на основе поля времени? - person Yoav Ben Moha; 31.01.2020
comment
Вы можете использовать "x": {"field": "Name", "type": "nominal", "sort": {"field": "Time"}} для сортировки оси X по полю времени. - person jakevdp; 31.01.2020
comment
Я пробовал несколько вариантов добавления всплывающей подсказки для отображения поля времени. Вы могли бы посоветовать ? : tooltip: {field: Time, type: temporal}, - person Yoav Ben Moha; 04.02.2020
comment
Это должно сработать, если вы хотите, чтобы всплывающая подсказка отображала необработанную временную метку. Если вы хотите отображать время в единицах времени, используемых на оси Y, вы должны указать это: "tooltip": {"field": "Time", "type": "temporal", "timeUnit": "minutessecondsmilliseconds"} - person jakevdp; 04.02.2020