如何用Seaborn创建col1-col5与col6-col10对比的热力图
实现DataFrame分组对比热力图的方法
问题背景
我有如下DataFrame:
col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 2 12 8 3 16 9 5 13 11 14 3 14 7 9 18 12 14 14 13 13 5 15 10 5 8 10 18 9 8 5
我希望生成一个热力图,实现col1-col5与col6-col10的对比,结构如下:
col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
实现方案
要实现这种分组对比的热力图,核心是把数据重塑为纵轴对应col1-col5、横轴对应col6-col10的交叉匹配结构,再用热力图工具可视化。以下是具体步骤:
1. 数据拆分与重塑
先将原DataFrame拆分为左右两组,再通过行索引匹配,生成交叉组合的数据集:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造原DataFrame data = { 'col1': [2,3,5], 'col2': [12,14,15], 'col3': [8,7,10], 'col4': [3,9,5], 'col5': [16,18,8], 'col6': [9,12,10], 'col7': [5,14,18], 'col8': [13,14,9], 'col9': [11,13,8], 'col10': [14,13,5] } df = pd.DataFrame(data) # 拆分左右列组 left_group = ['col1','col2','col3','col4','col5'] right_group = ['col6','col7','col8','col9','col10'] # 转为长格式并保留行索引,用于匹配 left_long = df[left_group].stack().reset_index() left_long.columns = ['row_id', 'left_col', 'val'] right_long = df[right_group].stack().reset_index() right_long.columns = ['row_id', 'right_col', 'val'] # 合并得到所有交叉组合,再转换为热力图需要的宽格式 merged = pd.merge(left_long, right_long, on='row_id') heatmap_df = merged.pivot_table(index='left_col', columns='right_col', values='val_x', aggfunc='first')
注:val_x对应左组数值,若要对比差值,可新增merged['diff'] = merged['val_x'] - merged['val_y'],再用diff列生成热力图。
2. 绘制目标结构热力图
用Seaborn绘制热力图,调整轴标签布局适配需求:
plt.figure(figsize=(10,8)) ax = sns.heatmap(heatmap_df, annot=True, cmap='coolwarm', fmt='g') # 设置轴标签显示方式:左侧垂直、顶部倾斜 ax.set_yticklabels(ax.get_yticklabels(), rotation=0) ax.set_xticklabels(ax.get_xticklabels(), rotation=45) plt.title('col1-col5 与 col6-col10 热力对比') plt.tight_layout() plt.show()
生成的热力图会以纵轴展示col1-col5、横轴展示col6-col10,每个单元格对应原DataFrame中每行的左右组数值匹配,完全符合你需要的结构。
内容的提问来源于stack exchange,提问作者Jahrakal
相关产品推荐
相关产品推荐

