如何基于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()
代码说明
draw_heatmap函数:负责将每个分组的数据转换为热力图所需的透视表格式,然后调用sns.heatmap并传入指定的LogNorm参数FacetGrid设置:通过row='A'和col='B'指定分面的行和列,margin_titles=True会显示行/列的分组标题- 配色与布局:可以根据需求替换
cmap参数选择不同的配色方案,plt.tight_layout()用于自动调整子图间距,避免标签重叠
内容的提问来源于stack exchange,提问作者The Nightman
相关产品推荐
相关产品推荐

