如何在Python中叠加绘制两张热力图?
如何叠加Seaborn热力图:背景图+热点图
要实现两张热力图的叠加,核心是让热点图的非高亮区域透明,同时控制高亮区域的透明度,避免完全覆盖背景图。你可以通过以下修改实现:
- 绘制背景热力图后,绘制热点图时添加
mask参数隐藏0值区域,同时用alpha控制高亮区域的透明度。 - 可选:关闭热点图的颜色条(
cbar=False),避免重复显示。
完整示例代码
import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 生成测试数据:20×20背景图,划分为3个区域 background = np.zeros((20,20)) background[:7, :] = 1 # 第一区域 background[7:14, :] = 2 # 第二区域 background[14:, :] = 3 # 第三区域 # 生成热点图:仅(10,10)附近5×5区域高亮,其余为0 hotspot = np.zeros((20,20)) hotspot[8:13, 8:13] = 5 # 绘制背景热力图 sns.heatmap(background, cmap='Greys', cbar=True) # 绘制热点热力图:隐藏0值区域,设置透明度 sns.heatmap(hotspot, cmap='RdBu_r', mask=(hotspot == 0), # 隐藏值为0的区域 alpha=0.7, # 控制高亮区域透明度 cbar=False) # 关闭热点图的颜色条,避免重复 plt.show()
关键参数说明
mask=(hotspot == 0):让热点图中值为0的区域不被绘制,这样背景图的对应区域完全可见。alpha=0.7:设置高亮区域的透明度(范围0-1),数值越小越透明,能更好地保留背景的细节。cbar=False:如果不需要单独的热点图颜色条,可以关闭,避免画面冗余;如果需要,可以调整颜色条的位置(比如用cbar_kws={'location': 'right'})。
如果不局限于Seaborn,也可以用Matplotlib的imshow实现叠加,思路类似:先画背景的imshow,再画热点的imshow并设置alpha和mask。
内容的提问来源于stack exchange,提问作者seeker_after_truth
相关产品推荐
相关产品推荐

