本文分享一种可以绘制日历热力图的实现方法,使用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()
发表回复