使用python绘制日历热力图

akimido 的头像

本文分享一种可以绘制日历热力图的实现方法,使用Python进行绘制、其中得到了chatgpt3.5的指导与修改。如您对实现方案有改进意见,可后台联系我们或者发送邮件到hiakimido@gmail.com .

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import calendar
import matplotlib.ticker as ticker
import matplotlib.colors as colors
# 读取气象数据的CSV文件(假设文件名为meteo_data.csv,路径为D:\datatest\)
df = pd.read_csv(r'C:\Users\akimido\Desktop\data2023.csv')

# 将日期列转换为Datetime格式
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d %H:%M')

# 创建子图布局(3行4列)
fig, axs = plt.subplots(3, 4, figsize=(12, 9))

plt.rcParams["font.family"] = "Times New Roman"

# 遍历每个月份,生成日历热力图
for month in range(1, 13):
    # 提取指定月份的数据
    target_data = df[df['Date'].dt.month == month]

    # 计算每天的数据量
    daily_counts = target_data.groupby(target_data['Date'].dt.day).size().reset_index(name='Count')

    # 获取子图的索引
    row_index = (month - 1) // 4
    col_index = (month - 1) % 4

    # 创建子图
    ax = axs[row_index, col_index]

    # 创建日历热力图
    calendar_matrix = np.zeros((6, 7))
    month_days = calendar.monthrange(2022, month)[1]  # 获取指定月份的天数
    for _, row in daily_counts.iterrows():
        date = row['Date']
        count = row['Count']
        day_of_week = calendar.weekday(2022, month, date)
        row_index = (date - 1) // 7
        col_index = (day_of_week + 1) % 7  # 将周六设为0,周日设为6
        calendar_matrix[row_index, col_index] = count

    # 绘制日历热力图
    im = ax.imshow(calendar_matrix, cmap='Blues', vmin=0, vmax=calendar_matrix.max())

    # 添加日期文本(黑色字体)
    for i in range(6):
        for j in range(7):
            day_num = i * 7 + j + 1
            if day_num <= month_days:
                text = str(day_num)
                ax.text(j, i, text, ha='center', va='center', color='black')

    # 隐藏坐标轴
    ax.axis('off')

    # 设置子图标题
    ax.set_title(calendar.month_name[month])

# 调整子图之间的间距
fig.tight_layout()

# 添加整体标题
fig.suptitle('2023 Observation Data Calendar', fontsize=10)

# 创建自定义 Locator
locator = ticker.MaxNLocator(nbins=5)  # 设置标尺刻度数量

# 创建自定义 Normalize
norm = colors.Normalize(vmin=0, vmax=300)  # 设置数据范围

# 添加颜色标尺
cbar = fig.colorbar(im, ax=axs.ravel().tolist(), shrink=0.6, ticks=locator, format=ticker.FuncFormatter(lambda x, pos: int(x)))  # 使用 lambda 函数将标尺格式化为整数
cbar.ax.set_ylabel('Data Range', rotation=-90, va="bottom")

plt.savefig('2023_calendar_heatmap.png', dpi=500)

# 显示图表
plt.show()

Tagged in :

akimido 的头像

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注