В продолжение марафонской истории я расскажу, как мы создавали визуализацию. Работа над проектом шла поэтапно: идея, дизайн, реализация и наполнение данными.
Идея показать результаты забега пришла ко мне после участия в «Весеннем громе». Скучные официальные таблицы никак не отражали настроение забега, при этом данные были в открытом доступе — сложные и интересные. Лаборатория только открылась, и в качестве тестового задания для вакансии дизайнера я выбрала задачу о визуализации результатов «Весеннего грома». Из десятка вариантов мне больше всего понравилась идея Сергея Долинина svetosil — показать распределение участников в момент первого финиша:

Мы взяли за основую эту идею и оживили её временным слайдером. Визуализация марафона стала первым проектом Серёжи в лаборатории.
Итак, мы решили показать распределение бегунов по трассе в каждый момент времени, полово-возрастной состав участников и их распределение на финише, высотный профиль трассы, погоду, фотографии и интересные факты, а также полную таблицу результатов с фильтрами по возрастным группам, команде и городу. Чтобы все данные поместились на одной диаграмме пришлось попотеть. Довольно долго таблица располагалась справа от карты:

Высотный профиль показали, спроецировав его на поля слева и снизу, как на этой карте Германии, которую я давным-давно откопала на книжных развалах в Риме (сейчас она висит в Коворкафе):

Получилось не слишком понятно, зато рельеф привязан к маршруту. Оставляем так:

В конце концов слайдер и таблица переезжают под карту, а маршрут обрастает шутками и фактами. Ещё тут видны конкретные бегуны (к сожалению, реализовать эту функциональность мы так и не успели):

Тем временем, готовим технический каркас для «змея». Чип каждого спортсмена фиксировал время прохождения промежуточных рубежей (10, 21, 30, 35 км и финиш). Исходя из предположения, что между этими точками спортсмены двигались равномерно, мы получили распределение толпы на трассе.
Реализацией занимался Глеб Арестов arestov. Он взял за основу d3-шный стримграф и научился строить его вдоль кривой. Вот что рассказывает Глеб:
«Мы строили график по двум точкам:
1) точка, удалённая на n метров от начала пути, заданного через географические координаты
2) точка, находящаяся на отрезке перпендикулярном касательной к кривой в первой точке на необходимой высоте (высоте змея)
Касательная в данном случае не вычисляется, а точка вычисляется через прямую (которая заменяет касательную), заданную двумя точками — серединами двух отрезков, одного отрезка от предыдущего соседа до текущей опорной точки и неё до следующего соседа (соседи — тоже опорные точки). Чтобы получить координаты ищется угол между осью Х и этой прямой (это угол потом будет использоваться ещё для построения кривых Безье).»
От себя добавлю, что змей строится по географическим координатам, но на фон пришлось подложить карту-картинку, потому что настоящие карты не получилось смасштабировать нужным образом.
Сначала налажали с геометрией:

Исправились:

Добавили деление на группы:

Привязали высоты (здесь они сильно скачут из-за слишком большой детализации):

После это натянули на каркас готовый дизайн, осталось оживить картину реальными данными.
Мы тестировали змея на результатах питерских «Белых ночей», нам оставалось только подменить эти данные московскими.
В последний момент перед стартом маршрут марафона изменился (Крымскую набережную не успели открыть после ремонта). Но нам было достаточно заменить старый кусок маршрута на новый — путь змея и высоты пересчитались автоматически.
Договориться с организаторами о предоставлении данных в удобном виде не удалось. Поэтому мы просто брали итоговые протоколы с сайта, распознавали, правили вручную и складывали в отдельный файл. (А это проще сказать, чем сделать, в общей сложности на работу ушло 2-3 дня). Проще было распарсить сайт, скажете вы, но результаты там были опубликованы гораздо позже появления протоколов — мы попросту не дождались.
Вот что получилось: moscowmarathon2017.datalaboratory.ru
Работа над проектом заняла полтора месяца. За это время мы с Серёжей успели съездить в беговой лагерь в Хорватии, где вместе тренировались и работали. Обычно мы лишены такой возможности — я сижу в Москве, а Серёжа в Питере. На фото мы слева:

Кстати, в лаборатории полнейший ремоут. Мы работаем удалённо с клиентами из Москвы, Питера, Минска, Тюмени, Сербии, Мельбурна. Об этом я расскажу подробнее в следующих заметках :-)
UPD. По совету KoGor добавила детали в описание технической реализации.
Идея
Идея показать результаты забега пришла ко мне после участия в «Весеннем громе». Скучные официальные таблицы никак не отражали настроение забега, при этом данные были в открытом доступе — сложные и интересные. Лаборатория только открылась, и в качестве тестового задания для вакансии дизайнера я выбрала задачу о визуализации результатов «Весеннего грома». Из десятка вариантов мне больше всего понравилась идея Сергея Долинина svetosil — показать распределение участников в момент первого финиша:

Мы взяли за основую эту идею и оживили её временным слайдером. Визуализация марафона стала первым проектом Серёжи в лаборатории.
Дизайн
Итак, мы решили показать распределение бегунов по трассе в каждый момент времени, полово-возрастной состав участников и их распределение на финише, высотный профиль трассы, погоду, фотографии и интересные факты, а также полную таблицу результатов с фильтрами по возрастным группам, команде и городу. Чтобы все данные поместились на одной диаграмме пришлось попотеть. Довольно долго таблица располагалась справа от карты:

Высотный профиль показали, спроецировав его на поля слева и снизу, как на этой карте Германии, которую я давным-давно откопала на книжных развалах в Риме (сейчас она висит в Коворкафе):

Получилось не слишком понятно, зато рельеф привязан к маршруту. Оставляем так:

В конце концов слайдер и таблица переезжают под карту, а маршрут обрастает шутками и фактами. Ещё тут видны конкретные бегуны (к сожалению, реализовать эту функциональность мы так и не успели):

Техническая реализация
Тем временем, готовим технический каркас для «змея». Чип каждого спортсмена фиксировал время прохождения промежуточных рубежей (10, 21, 30, 35 км и финиш). Исходя из предположения, что между этими точками спортсмены двигались равномерно, мы получили распределение толпы на трассе.
Реализацией занимался Глеб Арестов arestov. Он взял за основу d3-шный стримграф и научился строить его вдоль кривой. Вот что рассказывает Глеб:
«Мы строили график по двум точкам:
1) точка, удалённая на n метров от начала пути, заданного через географические координаты
2) точка, находящаяся на отрезке перпендикулярном касательной к кривой в первой точке на необходимой высоте (высоте змея)
Касательная в данном случае не вычисляется, а точка вычисляется через прямую (которая заменяет касательную), заданную двумя точками — серединами двух отрезков, одного отрезка от предыдущего соседа до текущей опорной точки и неё до следующего соседа (соседи — тоже опорные точки). Чтобы получить координаты ищется угол между осью Х и этой прямой (это угол потом будет использоваться ещё для построения кривых Безье).»
От себя добавлю, что змей строится по географическим координатам, но на фон пришлось подложить карту-картинку, потому что настоящие карты не получилось смасштабировать нужным образом.
Сначала налажали с геометрией:

Исправились:

Добавили деление на группы:

Привязали высоты (здесь они сильно скачут из-за слишком большой детализации):

После это натянули на каркас готовый дизайн, осталось оживить картину реальными данными.
Наполнение данными
Мы тестировали змея на результатах питерских «Белых ночей», нам оставалось только подменить эти данные московскими.
В последний момент перед стартом маршрут марафона изменился (Крымскую набережную не успели открыть после ремонта). Но нам было достаточно заменить старый кусок маршрута на новый — путь змея и высоты пересчитались автоматически.
Договориться с организаторами о предоставлении данных в удобном виде не удалось. Поэтому мы просто брали итоговые протоколы с сайта, распознавали, правили вручную и складывали в отдельный файл. (А это проще сказать, чем сделать, в общей сложности на работу ушло 2-3 дня). Проще было распарсить сайт, скажете вы, но результаты там были опубликованы гораздо позже появления протоколов — мы попросту не дождались.
Заключение
Вот что получилось: moscowmarathon2017.datalaboratory.ru
Работа над проектом заняла полтора месяца. За это время мы с Серёжей успели съездить в беговой лагерь в Хорватии, где вместе тренировались и работали. Обычно мы лишены такой возможности — я сижу в Москве, а Серёжа в Питере. На фото мы слева:

Кстати, в лаборатории полнейший ремоут. Мы работаем удалённо с клиентами из Москвы, Питера, Минска, Тюмени, Сербии, Мельбурна. Об этом я расскажу подробнее в следующих заметках :-)
UPD. По совету KoGor добавила детали в описание технической реализации.