爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 955|回复: 0

[经验总结] 基于数据量的日历热力图的制作

[复制链接]

新浪微博达人勋

发表于 2023-11-19 21:47:49 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 akimido 于 2023-11-19 21:50 编辑

本文分享一种可以绘制日历热力图的实现方法,使用Python进行绘制、其中得到了chatgpt3.5的指导与修改。如您对实现方案有改进意见,可后台联系我或者发送邮件到hiakimido@gmail.com
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import calendar
  5. import matplotlib.ticker as ticker
  6. import matplotlib.colors as colors
  7. # 读取气象数据的CSV文件(假设文件名为meteo_data.csv,路径为D:\datatest\)
  8. df = pd.read_csv(r'C:\Users\akimido\Desktop\data2023.csv')

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  60. # 显示图表
  61. plt.show()
复制代码

Figure_1.png
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表