趋势(七)利用python绘制日历热图

趋势(七)利用python绘制日历热图

日历热图(Calendar Heatmap)简介

1

日历热图通过将事件聚合到日历网格中进行可视化分析,针对时序类数据特征较为直观,其中以github代码热图而知名。

快速绘制

  1. 基于plotly_calplot

    import pandas as pd
    import numpy as np
    from plotly_calplot import calplot
    
    
    # 自定义数据
    dt = pd.date_range('2022-09-01', '2023-10-15')
    values = np.random.randint(0, 100, len(dt))
    df = pd.DataFrame({"dt": dt, "value": values})
    
    # 绘制图形
    fig = calplot(
             df,
             x="dt",
             y="value"
    )
    
    fig.show()
    

    2

  2. 基于pyecharts

    import pandas as pd
    import numpy as np
    from pyecharts import options as opts
    from pyecharts.charts import Calendar
    import datetime
    import random
    
    # 自定义数据
    begin = datetime.date(2022, 1, 1)
    end = datetime.date(2022, 12, 31)
    data = [
        [str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]
        for i in range((end - begin).days + 1)
    ]
    
    c = (
        Calendar()
        .add("", data, calendar_opts=opts.CalendarOpts(range_="2022"))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="2022年微信步数情况"),
            visualmap_opts=opts.VisualMapOpts(
                max_=30000,
                min_=500,
                orient="horizontal",
                is_piecewise=True,
                pos_top="230px",
                pos_left="100px",
            ),
        )
    )
    
    c.render_notebook()
    

    3

  3. 基于calplot

    import numpy as np
    import pandas as pd
    import calplot
    import matplotlib.pyplot as plt
    
    # 自定义数据
    np.random.seed(sum(map(ord, 'calplot')))
    all_days = pd.date_range('1/1/2019', periods=730, freq='D')
    days = np.random.choice(all_days, 500)
    events = pd.Series(np.random.randn(len(days)), index=days)
    
    calplot.calplot(events, cmap='YlGn', figsize = (16, 8), colorbar=False)
    
    plt.show()
    

    4

  4. 基于july

    import numpy as np
    import matplotlib.pyplot as plt
    import july
    from july.utils import date_range
    
    # 自定义数据
    dates_2022 = date_range("2022-01-01", "2022-12-31")
    data_2022 = np.random.randint(0, 14, len(dates_2022))
    dates_2023 = date_range("2023-01-01", "2023-12-31")
    data_2023 = np.random.randint(0, 14, len(dates_2023))
    
    july.heatmap(dates_2022, data_2022, title='Github Activity', cmap="github")
    july.heatmap(dates_2023, data_2023, cmap="github")
    
    plt.show()
    

    5

定制多样化的日历热图

自定义日历热图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。

  1. 按月绘制

    import numpy as np
    import matplotlib.pyplot as plt
    import july
    from july.utils import date_range
    
    # 自定义数据
    dates = date_range("2022-01-01", "2022-12-31")
    data = np.random.randint(0, 14, len(dates))
    
    july.calendar_plot(dates, data)
    
    plt.show()
    

    6

  2. 指定月份绘制

    import numpy as np
    import matplotlib.pyplot as plt
    import july
    from july.utils import date_range
    
    # 自定义数据
    dates = date_range("2022-01-01", "2022-12-31")
    data = np.random.randint(0, 14, len(dates))
    
    # 初始化布局 
    fig, axes = plt.subplots(1, 2)
    
    # 带有日期标签
    july.month_plot(dates, data, month=5, date_label=True, ax=axes[0])
    axes[0].set_title('with date label') 
    
    # 带有数值标签
    july.month_plot(dates, data, month=5, value_label=True, ax=axes[1])
    axes[1].set_title('with value label') 
    
    
    plt.subplots_adjust(wspace=0.5)  # 增加子图之间的水平间隔
    plt.show()
    

    7

总结

以上通过plotly_calplot、pyecharts、calplot和july快速绘制日历热图。并通过修改参数或者辅以其他绘图知识自定义各种各样的日历热图来适应相关使用场景。

共勉~

作者:HsuHeinrich

物联沃分享整理
物联沃-IOTWORD物联网 » 趋势(七)利用python绘制日历热图

发表回复