如何使用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
相关产品推荐
相关产品推荐

