如何用Matplotlib contourf绘制温度测量相对分布热力图?
解决Matplotlib contourf绘制温度分位分布的问题
核心问题本质
你要绘制日期-分位数-温度的热力分布图,但contourf要求输入规整的二维Z矩阵,而每日样本量不同导致原始数据无法生成符合要求的矩阵,这是图表不符合预期的核心原因。
关键解决步骤
1. 数据预处理:生成规整的分位温度矩阵
对每个日期的温度数据,计算固定数量分位数(比如0%、1%...100%)对应的温度值,确保每个日期输出数量一致,从而构建规整的Z矩阵:
import numpy as np import pandas as pd # 假设数据存储在df中,包含'date'(日期)和'temp'(温度)列 unique_dates = df['date'].unique() # 定义要计算的分位数范围(0%-100%,步长1%) quantile_points = np.arange(0, 101) z_matrix = [] for date in unique_dates: # 获取当日有效温度数据 daily_temps = df[df['date'] == date]['temp'].dropna().values # 计算该日期各分位数对应的温度值 temp_percentiles = np.percentile(daily_temps, quantile_points) z_matrix.append(temp_percentiles) # 转换为numpy二维数组,形状为(日期数, 分位数数量) z_matrix = np.array(z_matrix)
2. 正确映射坐标轴与Z矩阵维度
contourf的输入需满足维度对应关系:
- X轴:日期数组(长度=日期数),需转换为matplotlib可识别的datetime格式
- Y轴:分位数数组(长度=分位数数量)
- Z轴:二维数组,需保证Z的行对应X轴每个点,列对应Y轴每个点,因此需要将z_matrix转置后传入:
import matplotlib.pyplot as plt # 转换日期为datetime格式,确保坐标轴正确排序 x_axis = pd.to_datetime(unique_dates) y_axis = quantile_points # 绘制contourf热力图 plt.figure(figsize=(12, 6)) # 转置z_matrix,让Y轴(分位数)对应Z的列方向 contour_plot = plt.contourf(x_axis, y_axis, z_matrix.T, cmap='coolwarm', levels=20) plt.colorbar(contour_plot, label='温度 (℃)') # 调整坐标轴样式 plt.ylabel('分位数 (%)') plt.xlabel('日期') plt.xticks(rotation=45) plt.tight_layout() plt.show()
3. 常见错误排查
- 未做分位转换:直接传入不规则的每日温度数据,导致Z矩阵维度不匹配,图形错乱。
- 日期未序列化:用字符串日期作为X轴,matplotlib无法正确排序和渲染刻度。
- Z矩阵维度不对应:未转置Z矩阵,导致X/Y轴与温度值的映射关系颠倒。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

