如何使用Seaborn或Matplotlib将热力图与等高线图叠加绘制?
叠加热力图与等高线的实现方案
我来帮你搞定这个需求!要在Seaborn热力图上叠加Matplotlib等高线,核心是确保两个数据集的坐标轴完全对齐,然后利用Matplotlib的contour函数来绘制百分比的等高线。下面是详细的步骤和修改后的代码:
步骤说明
- 统一数据集格式:两个CSV结构类似,所以都要做相同的转置处理,保证
α(x轴)和δ(y轴)的取值范围完全匹配 - 绘制基础热力图:保留你原来的热力图代码,但要获取当前的轴对象,方便后续叠加元素
- 准备等高线数据:提取第二个数据集的百分比数值,以及对应的
α和δ坐标值 - 叠加等高线:用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
相关产品推荐
相关产品推荐

