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

如何使用Seaborn或Matplotlib将热力图与等高线图叠加绘制?

叠加热力图与等高线的实现方案

我来帮你搞定这个需求!要在Seaborn热力图上叠加Matplotlib等高线,核心是确保两个数据集的坐标轴完全对齐,然后利用Matplotlib的contour函数来绘制百分比的等高线。下面是详细的步骤和修改后的代码:

步骤说明

  1. 统一数据集格式:两个CSV结构类似,所以都要做相同的转置处理,保证α(x轴)和δ(y轴)的取值范围完全匹配
  2. 绘制基础热力图:保留你原来的热力图代码,但要获取当前的轴对象,方便后续叠加元素
  3. 准备等高线数据:提取第二个数据集的百分比数值,以及对应的α和δ坐标值
  4. 叠加等高线:用Matplotlib的contour绘制等高线,可添加数值标签增强可读性

完整代码示例

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np

# 设置绘图风格
sns.set_theme()

# 读取并预处理两个数据集
# 第一个数据集:ϕ值,用于热力图
df_phi = pd.read_csv("data.csv", sep=";").transpose()
# 第二个数据集:百分比数值,用于等高线
df_percent = pd.read_csv("percent_data.csv", sep=";").transpose()

# 确保两个数据集的行列完全对齐(防止错位)
# 如果两个CSV的α/δ范围一致,这一步可以省略;如果有差异,用reindex对齐
df_percent = df_percent.reindex_like(df_phi)

# 绘制热力图
ax = sns.heatmap(
    df_phi,
    cmap="Reds",
    cbar_kws={"label": r'$\phi$'},
    vmin=0.0,
    vmax=1.2
)
ax.invert_yaxis()

# 准备等高线的坐标和数值
# 提取α的取值(x轴)和δ的取值(y轴),转换为numpy数组
x = df_phi.columns.astype(float).values
y = df_phi.index.astype(float).values
# 百分比数值的二维数组
z = df_percent.values.astype(float)

# 叠加等高线
# 可以通过levels参数指定要显示的等高线数值,比如levels=np.arange(0, 100, 10)
contour = plt.contour(
    x, y, z,
    colors="black",  # 等高线颜色
    linewidths=1.5,  # 线宽
    levels=5  # 等高线数量,或者自定义数值列表
)

# 添加等高线数值标签
plt.clabel(contour, inline=True, fontsize=10, fmt="%.1f%%")

# 设置坐标轴标签和布局
plt.xlabel(r'$\alpha$', fontsize=20)
plt.ylabel(r'$\delta$', fontsize=20)
plt.tight_layout()
plt.show()

关键细节说明

  • 数据集对齐:一定要保证两个数据集的α列和δ行完全匹配,否则等高线会错位。如果存在差异,用df_percent.reindex_like(df_phi)可以快速对齐
  • 坐标转换:Seaborn热力图默认用行列索引作为刻度,但contour需要实际的数值坐标,所以要把列名和索引转成数值类型的numpy数组
  • 等高线自定义:你可以根据需求调整contour的参数:
    • 用contourf可以绘制填充式等高线(和热力图搭配时建议用contour线条式,避免遮挡热力图)
    • 通过levels指定具体的百分比数值(比如levels=[10,20,30])
    • 修改colors、linewidths来调整等高线的样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:58:11