如何在Python中实现热力图与散点图的叠加展示?
热力图与散点图叠加展示解决方案
问题说明
我拥有两个DataFrame:
- 热力图数据集
windSpeedData:尺寸(189, 52),索引代表height(高度),列名代表日期,数据起始于2023-4-14 15:40:00,时间间隔为10分钟 - 散点图数据集
vData:尺寸(1542, 1),索引代表日期,值代表height(高度),数据起始于2023-4-14 15:26:00,时间间隔为20秒,日期范围远大于热力图
两者的高度标准一致,需要将散点图与热力图叠加展示,但现有代码的效果不符合预期:
现有代码问题
原代码使用inset_axes创建独立的散点图坐标轴,导致两个图的时间、高度刻度无法对齐,且图层顺序设置不合理,无法实现正确的叠加效果。
修正方案
核心思路是让散点图直接使用热力图的坐标轴,通过坐标映射将散点的日期和高度对应到热力图的离散刻度位置,确保两者完全对齐。
步骤1:统一数据格式
确保两个数据集的日期为datetime类型,方便后续坐标映射:
import pandas as pd # 转换热力图列名(日期)为datetime windSpeedData.columns = pd.to_datetime(windSpeedData.columns) # 转换散点图索引(日期)为datetime vData.index = pd.to_datetime(vData.index)
步骤2:完整叠加代码
import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 创建画布与主坐标轴 fig, ax = plt.subplots(figsize=(12, 8)) # 绘制热力图 sns.heatmap(windSpeedData, cmap='viridis', cbar_kws={'label': 'Wind Speed'}, ax=ax) # 设置热力图X轴(日期)刻度 xticks_interval = 5 # 可根据实际调整,避免刻度重叠 ax.set_xticks(np.arange(0, len(windSpeedData.columns), xticks_interval)) ax.set_xticklabels(windSpeedData.columns[::xticks_interval].strftime('%Y-%m-%d %H:%M'), rotation=45) # 设置热力图Y轴(高度)刻度 yticks_interval = 20 ax.set_yticks(np.arange(0, len(windSpeedData.index), yticks_interval)) ax.set_yticklabels(windSpeedData.index[::yticks_interval]) ax.invert_yaxis() # 反转Y轴,符合高度从上到下的常规展示 # 可选:过滤散点图中超出热力图时间范围的数据 heat_start = windSpeedData.columns.min() heat_end = windSpeedData.columns.max() filtered_vData = vData[(vData.index >= heat_start) & (vData.index <= heat_end)] # 将散点的日期映射到热力图X轴坐标 x_coords = np.interp(filtered_vData.index.astype(np.int64), windSpeedData.columns.astype(np.int64), np.arange(len(windSpeedData.columns))) # 将散点的高度映射到热力图Y轴坐标 y_coords = np.interp(filtered_vData['height'], windSpeedData.index, np.arange(len(windSpeedData.index))) # 在热力图坐标轴上绘制散点 ax.scatter(x_coords, y_coords, color='red', s=15, alpha=0.7, zorder=10, label='Height Observation') # 添加图例与调整布局 ax.legend() plt.tight_layout() plt.show()
关键细节说明
- 坐标映射:使用
np.interp实现连续的散点数据(20秒间隔日期、连续高度)到热力图离散坐标轴位置的线性插值,确保散点精准对应热力图的时间与高度位置 - 数据过滤:可选步骤,若需要保留全部散点(包括热力图时间范围外的部分),删除过滤代码即可,此时散点会显示在热力图的左右两侧
- 图层顺序:设置
zorder=10让散点位于热力图上方,保证散点可见 - 坐标轴共享:直接在热力图的坐标轴上绘制散点,彻底解决刻度对齐问题
内容的提问来源于stack exchange,提问作者wjzhywa6
相关产品推荐
相关产品推荐

