本文目录导读:

我来介绍如何使用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: 矩阵遮罩
这种热图特别适合展示类别变量之间的数值分布或相关性!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播