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

如何基于Seaborn的FacetGrid绘制多组合热力图并控制配色

问题描述

给定如下DataFrame:

A   B   Up  Down    p
0   1   x   A   A   0.5
1   1   x   T   T   0.5
2   1   y   G   G   0.5
3   1   y   C   C   0.5
4   2   x   A   A   0.5
5   2   x   T   T   0.5
6   2   y   G   G   0.5
7   2   y   C   C   0.5

生成该DataFrame的代码:

import pandas as pd

df = pd.DataFrame(
    {'A': {0: 1,1: 1,2: 1,3: 1,4: 2,5: 2,6: 2,7: 2},
     'B': {0: 'x',1: 'x',2: 'y',3: 'y',4: 'x',5: 'x',6: 'y',7: 'y'},
     'Up': {0: 'A', 1: 'T', 2: 'G', 3: 'C', 4: 'A', 5: 'T', 6: 'G', 7: 'C'},
     'Down': {0: 'A', 1: 'T', 2: 'G', 3: 'C', 4: 'A', 5: 'T', 6: 'G', 7: 'C'},
     'p': {0: 0.5,1: 0.5,2: 0.5,3: 0.5,4: 0.5,5: 0.5,6: 0.5,7: 0.5}})

需求:

  • 不再手动循环A和B的唯一组合生成单个热力图,改用sns.FacetGrid将所有热力图整合到同一画布
  • 每个热力图以Up为y轴、Down为x轴,用p列的值填充单元格
  • 保留指定的配色范围控制:使用LogNorm,设置vmin=1.0/(10.0**200),vmax=1.0
解决方案

核心思路是先将每个A、B分组的数据透视成热力图需要的宽表格式,再通过FacetGrid的自定义绘图函数绘制每个子图的热力图:

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm

# 定义每个子图的绘图函数
def draw_heatmap(data, **kwargs):
    # 将数据透视成Up为行、Down为列、p为值的格式
    pivot_data = data.pivot(index='Up', columns='Down', values='p')
    # 绘制热力图,应用LogNorm,设置配色归一化
    sns.heatmap(pivot_data, norm=LogNorm(vmin=1.0/(10.0**200), vmax=1.0), **kwargs)

# 创建FacetGrid,按A和B分面
g = sns.FacetGrid(df, row='A', col='B', margin_titles=True)
# 映射自定义绘图函数到每个分面
g.map_dataframe(draw_heatmap, cmap='viridis')  # 可根据需求替换配色方案

# 调整布局,避免标签重叠
plt.tight_layout()
plt.show()

代码说明

  1. draw_heatmap函数:负责将每个分组的数据转换为热力图所需的透视表格式,然后调用sns.heatmap并传入指定的LogNorm参数
  2. FacetGrid设置:通过row='A'和col='B'指定分面的行和列,margin_titles=True会显示行/列的分组标题
  3. 配色与布局:可以根据需求替换cmap参数选择不同的配色方案,plt.tight_layout()用于自动调整子图间距,避免标签重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:05:29