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

如何使用Python和Matplotlib重新对齐热力图坐标轴?

如何用Python和Matplotlib重新对齐热力图坐标轴

看起来你已经搭建好了热力图的基础数据结构,接下来咱们一步步解决坐标轴对齐的问题。首先补全你未完成的代码,然后针对常见的对齐需求(比如标签与单元格中心对齐、避免标签重叠)给出具体调整方案:

基础热力图绘制 + 坐标轴对齐调整

先把你的代码补全并添加对齐逻辑(注意修正了新版pandas的参数细节):

import pandas as pd
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt

# FILE INPUT PATH
FILE_PATH_INPUT = 'C:/Python/'
# IMPORT FILE
flights_raw = pd.read_excel(FILE_PATH_INPUT+'flights.xlsx', sheet_name='flights')  # 新版pandas中sheetname已改为sheet_name
flights_raw["month"] = pd.Categorical(flights_raw["month"], flights_raw.month.unique())
# CREATE MATRIX
flight_matrix = flights_raw.pivot("month", "year", "passengers")

# 开始绘制热力图并调整坐标轴
fig, ax = plt.subplots(figsize=(10,6))

# 用matplotlib的imshow绘制热力图
im = ax.imshow(flight_matrix.values, cmap='viridis', aspect='auto')

# 设置主刻度和标签:对应每个单元格的位置
ax.set_xticks(range(len(flight_matrix.columns)))
ax.set_xticklabels(flight_matrix.columns, fontsize=10)
ax.set_yticks(range(len(flight_matrix.index)))
ax.set_yticklabels(flight_matrix.index, fontsize=10)

### 核心对齐步骤:让刻度标签与单元格中心对齐
# 添加偏移0.5的次要刻度,用来绘制单元格分隔线
ax.set_xticks([x + 0.5 for x in ax.get_xticks()], minor=True)
ax.set_yticks([y + 0.5 for y in ax.get_yticks()], minor=True)
# 用次要刻度绘制白色网格,清晰分隔每个热力图单元格
ax.grid(which='minor', color='white', linestyle='-', linewidth=2)

### 可选:调整x轴标签避免重叠(比如年份标签)
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

# 添加颜色条和标题
fig.colorbar(im, label='乘客数量')
ax.set_title('各年月乘客数量热力图')

plt.tight_layout()
plt.show()

关键调整点说明

  • 单元格与标签对齐:默认imshow的刻度落在单元格边缘,通过给次要刻度偏移0.5,既可以画出分隔单元格的网格,也能让主刻度标签刚好对齐单元格中心。
  • 标签旋转与对齐:用plt.setp调整x轴标签的旋转角度和水平对齐方式(ha="right"),避免标签重叠,同时让标签更贴合刻度位置。
  • 适配新版pandas:你的代码里sheetname在新版pandas中已更名为sheet_name,我已经帮你修正了这个细节。

更简便的方案:用Seaborn(基于Matplotlib)

如果你不局限于纯Matplotlib,Seaborn的heatmap默认已经处理好了坐标轴对齐,只需要微调标签即可:

import seaborn as sns

fig, ax = plt.subplots(figsize=(10,6))
# annot=True可以显示单元格内的具体数值,fmt='d'表示以整数格式显示
sns.heatmap(flight_matrix, ax=ax, cmap='viridis', annot=True, fmt='d')  

# 同样调整x轴标签避免重叠
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")
ax.set_title('各年月乘客数量热力图')

plt.tight_layout()
plt.show()

这样就能得到对齐整齐、可读性强的热力图了。

内容的提问来源于stack exchange,提问作者PeterH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:59:51