You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:39:38