玩 ChatGPT,想针对博客的字数统计生成对应的热力图。
提问一小时后获得:

不是很符合要求,主要是这也太丑了……
但是不知道怎么继续问了,再修改变成了这样,好看了一点,但有重复……
就会变成这样:

把代码保存一下:

import os  
import glob  
import yaml  
import pandas as pd  
import matplotlib.pyplot as plt  
import matplotlib.patches as patches  
import seaborn as sns  
from matplotlib.ticker import FixedLocator  
from datetime import datetime  
from dateutil.parser import parse  
  
# 1. 遍历目录,获取所有MD文件的路径  
md_files = glob.glob('E:/Hugo/hugo-stack/2023/*.md')  
  
# 创建一个字典来保存每日的字数统计  
word_counts = {}  
  
# 2. 遍历所有MD文件  
for file_path in md_files:  
# 打开MD文件并读取内容  
with open(file_path, 'r', encoding='utf-8') as file:  
content = file.read()  
  
# 使用yaml模块读取日期文件中的元数据信息  
yaml_data = yaml.safe_load(content.split('---')[1])  
  
# 提取日期信息  
datetime_obj = yaml_data['date']  
  
# 提取中文字符数目  
chinese_word_count = len([c for c in content if '\u4e00' <= c <= '\u9fff'])  
  
# 将字数统计添加到字典中,日期作为键  
word_counts[datetime_obj] = chinese_word_count  
  
# 3. 创建Dataframe以便绘制热力图  
df = pd.DataFrame.from_dict(word_counts, orient='index', columns=['WordCount'])  
df.index = pd.DatetimeIndex(df.index) # 将索引转换为日期对象  
  
# 提取月份和天数  
df['Month'] = df.index.strftime('%m')  
df['Day'] = df.index.strftime('%d')  
  
# 使用pivot_table透视数据  
pivot_table = df.pivot_table(values='WordCount', index='Month', columns='Day')  
  
# 设置GitHub风格的绘图样式  
sns.set_theme()  
  
# 绘制热力图  
fig, ax = plt.subplots(figsize=(10, 6))  
im = ax.imshow(pivot_table, cmap='Blues', extent=[-0.5, len(pivot_table.columns) - 0.5, -0.5, len(pivot_table) - 0.5])  
  
# 设置横轴刻度和标签  
ax.set_xticks(range(len(df['Day'].unique())))  
ax.set_xticklabels(df['Day'].unique(), rotation=90)  
  
# 设置纵轴刻度和标签  
ax.set_yticks(range(12))  
ax.set_yticklabels(pd.date_range(start='2023-01', periods=12, freq='M').strftime('%B'))  
  
# 添加每天单独的方块  
for i in range(len(pivot_table)):  
for j in range(len(pivot_table.columns)):  
rect = patches.Rectangle((j-0.5, i-0.5), 1, 1, edgecolor='black', linewidth=0.5, facecolor='none', clip_on=False)  
ax.add_patch(rect)  
  
# 添加标题和标签  
ax.set_title('Daily Word Count Heatmap')  
ax.set_xlabel('Day')  
ax.set_ylabel('Month')  
  
# 设置图像边界和间距  
ax.set_xlim(-0.5, len(pivot_table.columns) - 0.5)  
ax.set_ylim(-0.5, len(pivot_table) - 0.5)  
plt.tight_layout()  
  
# 显示热力图  
plt.show()
 

删除 sns.set_theme() 就会变成单行但是没有透明背景,小编也不知道为什么,决定狠学数据分析。