- 积分
- 68
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2023-11-19
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 akimido 于 2023-11-19 21:50 编辑
本文分享一种可以绘制日历热力图的实现方法,使用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()
复制代码
|
|