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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:08:17