Seaborn热图X轴按月显示并添加月度分隔线的实现咨询
Seaborn热图X轴按月显示并添加月度分隔线的实现咨询
嘿,我来帮你搞定这个热图的优化需求!你现在的热图已经把城市(Estacao)用横线分隔开了,接下来要实现X轴按月显示、加上月度竖线分隔,咱们一步步来:
核心需求梳理
- 将原本按单日显示的X轴,改为只展示年月标签
- 在每个月份的边界添加黑色竖线,区分不同月度区间
- 保留你已经实现的城市分隔横线逻辑
具体实现步骤与代码
1. 先确保日期列是datetime类型(时间处理的基础)
如果你的Date列还不是datetime格式,先做转换,方便后续按月分组操作:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 转换日期格式(适配你原数据的dd/mm/yyyy格式) total['Date'] = pd.to_datetime(total['Date'], format='%d/%m/%Y')
2. 定位月度分隔线的位置
我们需要找到每个月第一个日期在热图列中的索引位置,这样才能精准画出分隔竖线:
# 生成透视表(和你原代码逻辑一致) total_matrix = total.pivot_table(index="Estacao", columns="Date", values="Media_Horaria_MP10") # 筛选每个月的第一个日期,获取它们在列中的位置索引 month_first_dates = total_matrix.columns.to_series().groupby(total_matrix.columns.to_period('M')).first() month_positions = [total_matrix.columns.get_loc(date) for date in month_first_dates] # 补充最后一列的位置,确保最后一个月也有完整分隔线 month_positions.append(total_matrix.shape[1])
3. 绘制热图并优化样式
这里修正了你原代码中横线循环的逻辑(原循环次数对应列数,应该按城市行数来),同时添加月度竖线、调整X轴标签:
fig, ax = plt.subplots(figsize=(18, 9), dpi=150) # 绘制基础热图 ax = sns.heatmap(total_matrix, cmap='crest') # 保留城市分隔的黑色横线(按城市行数+1循环,确保每个城市间都有分隔) for i in range(total_matrix.shape[0] + 1): ax.axhline(i, color='black', lw=2) # 添加月度分隔的黑色竖线 for pos in month_positions: ax.axvline(pos, color='black', lw=2) # 调整X轴:只显示年月标签,旋转避免重叠 ax.set_xticks([pos + 0.5 for pos in month_positions[:-1]]) # 将标签放在每个月的中间位置 ax.set_xticklabels([period.strftime('%Y-%m') for period in month_first_dates.index], rotation=45, ha='right') # 格式化标签并旋转提升可读性 # 调整布局,防止标签被截断 plt.title('MP10') plt.tight_layout() plt.show()
关键逻辑说明
- 转换日期为datetime类型后,用
dt.to_period('M')可以快速按年月分组,定位每个月的起始日期 - 用
axvline绘制竖线(你原代码的axhline是画横线,对应行的城市分隔,竖线对应列的月度分隔) - 调整X轴刻度时,将标签放在月度区间的中间位置,旋转45度避免标签重叠,提升可读性
这样处理后,你的热图就能清晰展示月度分隔,X轴也会按月有序展示啦!
备注:内容来源于stack exchange,提问作者Daniel M M
相关产品推荐
相关产品推荐

