Интерактивные тепловые карты календаря с Python — самый простой способ, который вы найдете

Создавайте собственные тепловые карты календаря, используя минимум кода.

На моем пути к разработке приложения мне было очень трудно сделать интерактивную тепловую карту календаря (вроде той, что есть на Github и Gitlab), и благодаря этому сообщению на форуме сообщества Plotly я смог это сделать.

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

(Этот проект с открытым исходным кодом и доступен на моем Github)

Монтаж

Этот пакет размещен на PyPI, поэтому для его установки просто используйте:

$ pip install plotly-calplot

Легко начать

Давайте сначала создадим пример фрейма данных.

import pandas as pd
import numpy as np
dummy_start_date = "2019-01-01"
dummy_end_date = "2021-10-03"
# date range from start date to end date and random
# column named value using amount of days as shape
dummy_df = pd.DataFrame({
    "ds": pd.date_range(dummy_start_date, dummy_end_date),
    "value": np.random.randint(low=0, high=30,
size=(pd.to_datetime(dummy_end_date) - pd.to_datetime(dummy_start_date)).days + 1,),
})

Единственное требование для использования этого графика — наличие фрейма данных Pandas со столбцом даты (см. документы pandas to_datetime) и столбцом значений, который будет использоваться в качестве значения, которое мы будем отображать.

Теперь к хорошему:

from plotly_calplot import calplot
# creating the plot
fig = calplot(
         dummy_df,
         x="ds",
         y="value"
)
fig.show()

И, конечно же, если у вас все еще есть все интерактивные функции Plotly (масштабирование, фильтрация, выбор лассо и наведение курсора)

Темная тема

Это хорошо и все такое, но, будучи программистами, мы очень любим темные темы, и, конечно же, вы можете использовать функцию update_layout, как и любую другую Plotly Figure. Но чтобы упростить задачу, у нас есть возможность использовать параметр dark_theme.

fig = calplot(
    dummy_df,
    x="ds",
    y="value",
    dark_theme=True
)
fig.show()

Имейте в виду разрыв

Все еще не убеждены? и я нет. Один из визуальных аспектов, с которым мне очень нравится экспериментировать, — это зазор между квадратами, и, к счастью, это легко достижимо:

# you can make it very large, but it's kinda silly
fig = calplot(
    dummy_df,
    x="ds",
    y="value",
    gap=9
)
fig.show()

# or you can make it zero, which is actually nice
fig = calplot(
    dummy_df,
    x="ds",
    y="value",
    gap=0
)
fig.show()

Выбор собственной цветовой гаммы

Другим очень важным аспектом графиков, очевидно, являются цвета, которые вы выбираете, calplot поддерживает все стандартные цветовые шкалы Plotly, и вы также можете создать свою собственную.

# choosing a standard colorscale
fig = calplot(
    dummy_df,
    x="ds",
    y="value",
    gap=0,
    colorscale="blues" # standard is greens
)
fig.show()

Но, конечно, вы можете захотеть создать свою собственную цветовую шкалу, есть несколько способов ее создания, мой любимый — использовать процент от максимальных значений.

# let's create a custom black and white colorscale
fig = calplot(
    dummy_df,
    x="ds",
    y="value",
    gap=0,
    colorscale=[(0.00, "white"),   (0.33, "#999"),
                (0.33, "#999"), (0.66, "#444"),
                (0.66, "#444"),  (1.00, "#000")]
)

Другие варианты

Я рекомендую вам изучить все другие варианты, предлагаемые пакетом, такие как добавление года в заголовок каждого подзаголовка с помощью years_title=True или настройка параметра month_lines_width, чтобы сделать его именно таким, как вам нравится. бесконечный:

# exploring some options
fig = calplot(
    dummy_df,
    x="ds",
    y="value",
    dark_theme=True,
    years_title=True,
    colorscale="purples",
    gap=0,
    name="Data",
    month_lines_width=3, 
    month_lines_color="#fff"
)
fig.show()

это обертка

Спасибо за чтение этой статьи, я разработал этот пакет как очень простой проект выходного дня, и он мне очень понравился, но код все еще немного грубоват по краям. Так что, если вам понравилось, не стесняйтесь связаться со мной или внести свой вклад в это.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.