本文目录导读:

我来介绍如何使用Pandas和Seaborn做数据分组热图(Heatmap),这里有几个常见案例:
基础数据准备
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
data = pd.DataFrame({
'地区': np.random.choice(['华北', '华东', '华南', '西南'], 100),
'产品': np.random.choice(['A', 'B', 'C', 'D'], 100),
'季度': np.random.choice(['Q1', 'Q2', 'Q3', 'Q4'], 100),
'销售额': np.random.randint(100, 1000, 100),
'利润': np.random.randint(10, 200, 100)
})
print("原始数据前5行:")
print(data.head())
案例1:地区×产品的销售额热图
# 使用pivot_table创建透视表
pivot_sales = pd.pivot_table(data,
values='销售额',
index='地区',
columns='产品',
aggfunc='mean',
fill_value=0)
print("销售额透视表:")
print(pivot_sales)
# 绘制热图
plt.figure(figsize=(8, 6))
sns.heatmap(pivot_sales,
annot=True, # 显示数值
fmt='.0f', # 数值格式
cmap='YlOrRd', # 颜色映射
linewidths=0.5)'各地区不同产品平均销售额热图')
plt.tight_layout()
plt.show()
案例2:季度×地区的利润分布热图
# 创建季度和地区的利润汇总
pivot_profit = data.groupby(['季度', '地区'])['利润'].mean().unstack()
print("利润透视表:")
print(pivot_profit)
# 绘制热图
plt.figure(figsize=(8, 6))
sns.heatmap(pivot_profit,
annot=True,
fmt='.1f',
cmap='RdYlGn', # 红黄绿色阶
center=50, # 居中值
linewidths=1,
linecolor='white')'各季度不同地区平均利润分布')
plt.show()
案例3:多级分组热图
# 创建更复杂的分组
pivot_multi = data.groupby(['地区', '季度'])['销售额'].mean().unstack(level='季度')
print("多级分组数据:")
print(pivot_multi)
# 绘制美观的热图
plt.figure(figsize=(10, 8))
sns.heatmap(pivot_multi,
annot=True,
fmt='.0f',
cmap='coolwarm',
center=pivot_multi.mean().mean(),
linewidths=0.5,
cbar_kws={'label': '平均销售额'})'各地区不同季度销售表现')
plt.xlabel('季度')
plt.ylabel('地区')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
案例4:相关性热图
# 计算数值列的相关性
numeric_cols = data.select_dtypes(include=[np.number]).columns
corr_matrix = data[numeric_cols].corr()
print("相关系数矩阵:")
print(corr_matrix)
# 绘制相关性热图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix,
annot=True,
fmt='.2f',
cmap='RdBu',
center=0,
vmin=-1,
vmax=1,
square=True, # 正方形格子
mask=np.triu(np.ones_like(corr_matrix, dtype=bool))) # 显示下半三角'数值变量相关性热图')
plt.tight_layout()
plt.show()
案例5:批量分组统计热图
def create_group_heatmap(data, index_col, columns_col, value_col,
aggfunc='mean', title='分组热图'):
"""创建分组热图的通用函数"""
# 创建透视表
pivot = pd.pivot_table(data,
values=value_col,
index=index_col,
columns=columns_col,
aggfunc=aggfunc,
fill_value=0)
print(f"透视表 ({index_col} × {columns_col}):")
print(pivot)
print("\n")
# 绘制热图
plt.figure(figsize=(10, 6))
sns.heatmap(pivot,
annot=True,
fmt='.1f',
cmap='YlOrRd',
linewidths=1,
cbar_kws={'label': f'平均{value_col}'})
plt.title(title)
plt.xlabel(columns_col)
plt.ylabel(index_col)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
return pivot
# 使用通用函数创建不同热图
create_group_heatmap(data, '地区', '产品', '销售额',
title='各地区-产品销售额分布')
create_group_heatmap(data, '季度', '产品', '利润',
title='各季度-产品利润分布')
案例6:标准化热图(归一化)
# 创建地区产品销售额透视表
pivot_raw = pd.pivot_table(data,
values='销售额',
index='地区',
columns='产品',
aggfunc='mean',
fill_value=0)
# 行归一化(按地区)
pivot_row_norm = pivot_raw.div(pivot_raw.sum(axis=1), axis=0)
print("行归一化数据(每个地区产品占比):")
print(pivot_row_norm)
# 绘制归一化热图
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
# 原始值热图
sns.heatmap(pivot_raw, annot=True, fmt='.0f',
cmap='Blues', ax=axes[0])
axes[0].set_title('原始销售额')
# 归一化热图
sns.heatmap(pivot_row_norm, annot=True, fmt='.1%',
cmap='Greens', ax=axes[1])
axes[1].set_title('各产品销售占比(按地区)')
plt.tight_layout()
plt.show()
高级技巧
# 8.1 自定义颜色和格式
def custom_heatmap(pivot_data, title="自定义热图"):
plt.figure(figsize=(10, 8))
ax = sns.heatmap(pivot_data,
annot=True,
fmt='.0f',
cmap=sns.color_palette("viridis", as_cmap=True),
annot_kws={'size': 10, 'weight': 'bold'},
cbar_kws={'shrink': 0.8},
linewidth=2,
linecolor='white')
plt.title(title, fontsize=16, fontweight='bold')
plt.tight_layout()
return ax
# 8.2 网格数据的分组分析
pivot_grid = data.groupby(['地区', '季度', '产品'])['销售额'].sum()
pivot_simple = pivot_grid.groupby(level=['地区', '季度']).mean().unstack()
print("网格分组数据:")
print(pivot_simple)
custom_heatmap(pivot_simple, "地区×季度平均销售额热图")
核心步骤:
- 数据准备:使用Pandas分组聚合
- 透视转换:用
pivot_table()或groupby().unstack() - 可视化:用Seaborn的
heatmap() - 美化:调整颜色、标签、格式等
常用功能:
annot=True: 显示数值fmt: 数值格式 ('.0f','.1%'等)cmap: 颜色映射center: 颜色居中值mask: 矩阵遮罩
这种热图特别适合展示类别变量之间的数值分布或相关性!