Как создать график тепловых линий

Создание графика тепловых линий советы и рекомендации

Создание многомерного графика с сегментированной линией

Вы, наверное, слышали о тепловой карте. Это двухмерные цветовые сетки, которые можно использовать для представления нескольких (обычно 3) измерений данных. Например, на тепловой карте ниже показана средняя температура в Южных Скалистых горах по месяцам и годам.

Тепловая карта, показывающая среднюю температуру в Южных Скалистых горах с 1950 по 2020 годы. [CC BY-SA 4.0]

Тепловые карты пришли мне на ум, когда мне понадобилось визуализировать некоторые данные из Strava. Я хотел сравнить некоторые недавние марафоны, которые я пробежал, рассматривая мою скорость бега и пульс (зоны) на протяжении 42,2 км каждого забега. Поэтому мне пришла в голову идея использовать линейный график, где каждый интервал в 1 км будет значением на оси x, а скорость во время этих интервалов – значениями на оси y. Но что насчет моего пульса (как показателя усилия) в этих интервалах? Стандартный линейный график в Matplotlib (моей выбранной графической библиотеке) не предоставляет простого способа закодировать такие дополнительные измерения, потому что свойства такие как цвет линии, толщина и стиль закреплены и применяются ко всему графику в целом. Для моего случая использования я хотел иметь возможность изменять свойства отдельных сегментов линии, чтобы, например, использовать цвет для отображения зон пульса в разных частях гонки.

Это довольно просто сделать, и это полезный пример, который показывает, когда и зачем стоит обратить внимание на дополнительные возможности Matplotlib. Основная идея заключается в том, чтобы отобразить каждый из сегментов линии отдельно. Таким образом, мы можем отдельно управлять визуальными свойствами каждого сегмента, чтобы, например, цвет сегмента линии можно было использовать для представления пульса в данном случае.

Мы можем сделать это, используя LineCollection из Matplotlib, как удобный способ отрисовки нескольких линий (или сегментов линий) с отдельными цветами и толщинами. Для этого нам нужно преобразовать наш список точек (x, y) в список координат начала и конца каждого сегмента линии. Например, имея следующие точки (x, y)…

(x0, y0), (x1, y1), …, (xn, yn)

… нам нужно создать список сегментов линий следующим образом:

[ [(x0, y0), (x1, y1)], [(x1, y1), (x2, y2)], …, [(xn-1, yn-1), (xn, yn)] ]

Это то, чем занимаются строки 12-16 в приведенном ниже коде. Хотя приведенное выше представление является упрощенным в целях объяснения.