目录
一、热力图的作用
二、热力图反映的信息类型
三、热力图的典型应用场景
1. 地球信息系统 (GIS)
2. 城市交通分析
3. 市场分析
4. 用户行为分析
5. 网络流量分析
6. 传染病传播分析
7. 社交媒体舆情分析
四、Python 绘制热力图的关键技术要点
1. 数据预处理
2. 颜色选择与渐变效果
3. 图形美化技巧
4. 高级技巧
五、章节总结
一、热力图的作用
热力图在多个领域中具有广泛的应用和重要意义。首先,热力图能够直观地展示数据的分布、密度和集中程度,帮助分析人员快速识别数据的热点区域和冷点区域,发现数据中的模式和异常。
其次,热力图在市场分析和用户行为分析中发挥着重要作用。通过分析用户在网络界面上的鼠标移动轨迹,热力图可以揭示用户的兴趣点和互动行为。此外,热力图还能分析用户在浏览新闻或博客时的已关注焦点,揭示哪些内容最能激发用户的兴趣。
在医学领域,热力图用于揭示数据在地理空间上的密度分布,帮助分析医疗资源的分布和人口密度等重要信息。通过观察热力图,可以快速发现热点区域,有助于针对性地进行资源分配和疾病防控工作。
最后,热力图在科学研究和决策支持中也具有重要意义。
热力图 (Heatmap) 通过颜色深浅来可视化二维数据的数值分布,其核心作用包括:
数据模式识别:直观展示数据的高低分布、聚类特征和异常值
多变量关联分析:在矩阵中同时呈现多个变量间的关系强度
趋势与异常检测:通过颜色渐变快速识别数据热点区域
空间数据可视化:特别适合展示地理、时间等二维空间上的数据变化
与其他图表相比,热力图的优势在于能够在有限空间内展示高密度数据,同时保留数据的整体分布特征。
二、热力图反映的信息类型
数值大小:通过颜色深浅直接反映数值高低
数据分布:集中趋势、离散程度和异常值位置
关联关系:变量间的相关性强弱(如相关系数矩阵)
时间 / 空间变化:地理区域差异或时间序列变化(如气温变化热力图)
聚类特征:相似数值区域的聚集情况
例如,在用户行为分析中,热力图可以展示不同页面元素的点击频率分布;在基因表达分析中,可呈现不同基因在不同条件下的表达水平差异。
三、热力图的典型应用场景
1. 地球信息系统 (GIS)
用途:展示地理空间数据,如气温分布、地形高度、人口密度
示例:2000-2024年全球各大洲平均气温热力图,用颜色梯度表示温度变化
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
def generate_sample_data():
"""生成示例数据(实际应用中应替换为真实数据)"""
years = list(range(2000, 2025))
regions = ["非洲", "亚洲", "欧洲", "北美洲", "南美洲", "大洋洲"]
# 创建随机数据,模拟气温变化趋势(逐年上升)
np.random.seed(42) # 设置随机种子,确保结果可重现
base_temps = np.array([25.5, 15.2, 10.3, 8.1, 19.8, 18.5]) # 各区域基准温度
trends = np.array([0.05, 0.07, 0.06, 0.08, 0.04, 0.05]) # 各区域温度上升趋势
data = []
for year in years:
for i, region in enumerate(regions):
# 计算该年份该区域的温度:基准温度 + 趋势 * 年数 + 随机波动
temp = base_temps[i] + trends[i] * (year - 2000) + np.random.normal(0, 0.3)
data.append([year, region, temp])
return pd.DataFrame(data, columns=["年份", "区域", "温度(°C)"])
def create_temperature_heatmap(data):
"""创建全球年平均气温变化热力图"""
# 转换数据为适合热力图的格式(年份作为行,区域作为列)
pivot_data = data.pivot(index="区域", columns="年份", values="温度(°C)")
# 创建自定义颜色映射(蓝色到红色,表示低温到高温)
colors = [(0.2, 0.2, 0.8), (0.8, 0.2, 0.2)] # 蓝到红
cmap = LinearSegmentedColormap.from_list("BlueRed", colors, N=100)
# 创建画布
plt.figure(figsize=(14, 8))
# 计算数据的最小值和最大值,用于颜色映射
min_temp = pivot_data.values.min()
max_temp = pivot_data.values.max()
# 绘制热力图
ax = sns.heatmap(pivot_data,
cmap=cmap,
annot=True,
fmt=".1f",
linewidths=.5,
cbar_kws={"label": "温度(°C)", "shrink": 0.8},
vmin=min_temp,
vmax=max_temp)
# 添加标题和标签
plt.title("2000-2024年全球各区域年平均气温变化热力图", fontsize=16)
plt.xlabel("年份", fontsize=12)
plt.ylabel("区域", fontsize=12)
# 旋转x轴标签
plt.xticks(rotation=45)
# 添加温度变化趋势线
fig, ax2 = plt.subplots(figsize=(12, 6))
for region in data["区域"].unique():
region_data = data[data["区域"] == region]
ax2.plot(region_data["年份"], region_data["温度(°C)"], 'o-', label=region)
ax2.set_title("2000-2024年全球各区域年平均气温变化趋势", fontsize=16)
ax2.set_xlabel("年份", fontsize=12)
ax2.set_ylabel("温度(°C)", fontsize=12)
ax2.legend()
ax2.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# 生成示例数据
temperature_data = generate_sample_data()
# 创建并显示热力图
create_temperature_heatmap(temperature_data)
效果展示:
这个代码实现了以下功能:
数据生成:创建了模拟的全球气温数据,包含 2000-2024 年六大区域(非洲、亚洲、欧洲、北美洲、南美洲、大洋洲)的年平均温度
热力图绘制:使用 Seaborn 的 heatmap 函数创建热力图,用蓝色到红色的渐变色表示温度从低到高
温度趋势分析:添加了各区域温度变化趋势线图,直观展示气温变化趋势
可视化优化:包含了中文支持、合适的标签、颜色条和图表样式
在实际应用中,可以将generate_sample_data()函数替换为真实的温度数据读取函数,从 CSV 或数据库中获取实际观测数据。代码中的颜色映射和样式可以根据需要进行调整,以达到最佳的可视化效果。
2. 城市交通分析
用途:实时监测交通拥堵状况、人流量分布
示例:这是一个反映5月21日,北京杜家坎收费站区域,从凌晨4:30至夜间23:30交通拥堵情况的热力图,红色表示严重拥堵,绿色表示畅通。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
def generate_traffic_data():
"""生成杜家坎收费站区域交通拥堵模拟数据"""
# 生成时间序列(4:30到23:30,每30分钟一个点)
times = pd.date_range(start="2025-05-21 04:30:00", end="2025-05-21 23:30:00", freq="30T")
# 生成方向和路段数据
directions = ["进京方向", "出京方向"]
sections = ["主路", "匝道1", "匝道2", "匝道3"]
# 创建数据框架
data = []
for time in times:
hour = time.hour
minute = time.minute
# 生成基础拥堵指数(0-畅通,1-轻度拥堵,2-中度拥堵,3-严重拥堵)
base_congestion = 0.5 # 默认基础值
# 早高峰(7:00-9:00)
if 7 <= hour < 9:
base_congestion = 2.5 + np.random.normal(0, 0.3)
# 晚高峰(17:00-19:00)
elif 17 <= hour < 19:
base_congestion = 2.8 + np.random.normal(0, 0.3)
# 夜间(22:00-次日5:00)
elif hour >= 22 or hour < 5:
base_congestion = 0.2 + np.random.normal(0, 0.1)
# 午间(12:00-14:00)
elif 12 <= hour < 14:
base_congestion = 1.0 + np.random.normal(0, 0.2)
else:
base_congestion = 1.5 + np.random.normal(0, 0.3)
# 匝道通常比主路拥堵
for direction in directions:
for section in sections:
section_factor = 0.5 if section == "主路" else 1.0
direction_factor = 1.0 if direction == "进京方向" else 0.8 # 进京方向通常更拥堵
# 最终拥堵指数(限制在0-3之间)
congestion = max(0, min(3, base_congestion * section_factor * direction_factor + np.random.normal(0, 0.2)))
data.append({
"时间": time,
"方向": direction,
"路段": section,
"拥堵指数": congestion
})
return pd.DataFrame(data)
def create_traffic_heatmap(data):
"""创建交通拥堵热力图"""
# 提取小时和分钟信息
data["小时"] = data["时间"].dt.hour
data["分钟"] = data["时间"].dt.minute
# 创建时间标签(如"04:30")
data["时间标签"] = data["时间"].dt.strftime("%H:%M")
# 选择要显示的时间段(只保留唯一的时间点)
time_labels = data[["时间", "时间标签"]].drop_duplicates()["时间标签"].tolist()
# 重塑数据以适应热力图
pivot_data = data.pivot_table(index=["方向", "路段"], columns="时间", values="拥堵指数")
# 创建自定义颜色映射(绿色-黄色-红色,表示畅通-轻度拥堵-严重拥堵)
colors = [(0.0, 0.8, 0.0), (1.0, 1.0, 0.0), (0.8, 0.0, 0.0)] # 绿-黄-红
cmap = LinearSegmentedColormap.from_list("TrafficMap", colors, N=100)
# 创建画布
plt.figure(figsize=(18, 8))
# 绘制热力图
ax = sns.heatmap(pivot_data,
cmap=cmap,
annot=False,
linewidths=.5,
cbar_kws={"label": "拥堵指数 (0=畅通, 3=严重拥堵)", "shrink": 0.7},
vmin=0,
vmax=3)
# 设置x轴标签(时间)
plt.xticks(range(0, len(time_labels), 2), time_labels[::2], rotation=45)
# 添加标题和标签
plt.title("2025年5月21日北京杜家坎收费站区域交通拥堵热力图", fontsize=16)
plt.xlabel("时间", fontsize=12)
plt.ylabel("方向/路段", fontsize=12)
# 添加颜色说明
plt.text(0, -0.5, "注:绿色表示畅通,黄色表示轻度拥堵,橙色表示中度拥堵,红色表示严重拥堵",
fontsize=10, transform=ax.transAxes)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# 生成交通数据
traffic_data = generate_traffic_data()
# 创建并显示热力图
create_traffic_heatmap(traffic_data)
效果展示:
这个代码实现了以下功能:
数据生成:创建了模拟的杜家坎收费站交通拥堵数据,考虑了不同时间段(早高峰、晚高峰等)和路段类型(主路、匝道)的拥堵特性
热力图绘制:使用 Seaborn 的 heatmap 函数创建热力图,用绿色 – 黄色 – 红色的渐变色表示从畅通到严重拥堵的程度
可视化优化:包含了中文支持、合适的标签、颜色条和图表样式,清晰展示了不同时间段和路段的拥堵情况
在实际应用中,可以将generate_traffic_data()函数替换为真实的交通数据读取函数,从交通管理部门的 API 或数据库中获取实际数据。代码中的颜色映射和拥堵指数范围可以根据实际需求进行调整。
3. 市场分析
用途:分析销售数据、价格分布、市场占有率
示例:这是一个反映6月18日某电商平台口红、平板电脑、男士卫衣、女士内衣、抽绳垃圾袋5中商品的销售热力图,展示这几种商品在北京、上海、广州、重庆、杭州5个地区的销售表现的热力图。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
def generate_sales_data():
"""生成618电商销售模拟数据"""
# 商品列表
products = ["口红", "平板电脑", "男士卫衣", "女士内衣", "抽绳垃圾袋"]
# 地区列表
regions = ["北京", "上海", "广州", "重庆", "杭州"]
# 创建数据框架
data = []
# 设置各商品的基础销量(模拟不同商品的受欢迎程度)
base_sales = {
"口红": 8000,
"平板电脑": 12000,
"男士卫衣": 6000,
"女士内衣": 9000,
"抽绳垃圾袋": 15000
}
# 设置各地区的消费能力系数
region_factors = {
"北京": 1.2,
"上海": 1.3,
"广州": 0.9,
"重庆": 0.8,
"杭州": 1.1
}
# 设置商品与地区的适配系数(模拟地域偏好)
product_region_factors = {
"口红": {"北京": 1.1, "上海": 1.3, "广州": 0.9, "重庆": 0.8, "杭州": 1.0},
"平板电脑": {"北京": 1.2, "上海": 1.2, "广州": 0.8, "重庆": 0.9, "杭州": 1.1},
"男士卫衣": {"北京": 1.0, "上海": 0.9, "广州": 0.7, "重庆": 1.1, "杭州": 1.0},
"女士内衣": {"北京": 1.0, "上海": 1.2, "广州": 1.1, "重庆": 0.9, "杭州": 1.0},
"抽绳垃圾袋": {"北京": 0.9, "上海": 0.8, "广州": 1.2, "重庆": 1.3, "杭州": 1.0}
}
# 生成数据
for product in products:
for region in regions:
# 计算理论销量:基础销量 × 地区系数 × 商品地区适配系数
theoretical_sales = base_sales[product] * region_factors[region] * product_region_factors[product][region]
# 添加随机波动(模拟实际销售中的不确定性)
actual_sales = max(0, int(theoretical_sales + np.random.normal(0, theoretical_sales * 0.1)))
data.append({
"商品": product,
"地区": region,
"销量": actual_sales
})
return pd.DataFrame(data)
def create_sales_heatmap(data):
"""创建电商销售热力图"""
# 重塑数据以适应热力图
pivot_data = data.pivot(index="商品", columns="地区", values="销量")
# 创建自定义颜色映射(从蓝色到红色,表示销量从低到高)
colors = [(0.2, 0.4, 0.8), (0.8, 0.2, 0.2)] # 蓝到红
cmap = LinearSegmentedColormap.from_list("SalesMap", colors, N=100)
# 创建画布
plt.figure(figsize=(12, 8))
# 绘制热力图
ax = sns.heatmap(pivot_data,
cmap=cmap,
annot=True,
fmt="d",
linewidths=.5,
cbar_kws={"label": "销量(件)", "shrink": 0.8},
annot_kws={"size": 10})
# 添加标题和标签
plt.title("2025年6月18日某电商平台商品销售热力图", fontsize=16)
plt.xlabel("地区", fontsize=12)
plt.ylabel("商品", fontsize=12)
# 为每个单元格添加销售排名注释
for i, product in enumerate(pivot_data.index):
region_sales = pivot_data.loc[product].sort_values(ascending=False)
for j, region in enumerate(pivot_data.columns):
rank = list(region_sales.index).index(region) + 1
plt.text(j + 0.8, i + 0.2, f"排名#{rank}", fontsize=8, color='white')
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# 生成销售数据
sales_data = generate_sales_data()
# 创建并显示热力图
create_sales_heatmap(sales_data)
效果展示:
这个代码实现了以下功能:
数据生成:创建了模拟的 618 电商销售数据,考虑了不同商品的基础销量、地区消费能力差异以及商品与地区的适配性
热力图绘制:使用 Seaborn 的 heatmap 函数创建热力图,用蓝色到红色的渐变色表示销量从低到高
可视化优化:包含了中文支持、销量数值标注、颜色条和图表样式,每个单元格还添加了该商品在各地区的销售排名
地域偏好模拟:不同商品在不同地区有不同的销售表现,例如平板电脑在一线城市销量较高,而抽绳垃圾袋在二线城市更受欢迎
4. 用户行为分析
用途:分析网站 / APP 用户点击行为、停留时间
示例:网页点击热力图,高亮显示用户最常点击的区域
5. 网络流量分析
用途:监控网络带宽使用情况、节点流量分布
示例:数据中心服务器流量热力图,识别流量高峰节点
6. 传染病传播分析
用途:追踪疫情传播路径、热点区域分布
示例:新冠疫情热力图,直观展示不同地区的感染人数密度
7. 社交媒体舆情分析
用途:分析话题热度的地域分布、时间变化
示例:社交媒体话题热度热力图,反映不同地区对某事件的已关注度
四、Python 绘制热力图的关键技术要点
1. 数据预处理
缺失值处理:使用fillna()填充缺失值或删除含缺失值的行 / 列
数据标准化:对于不同量纲的数据,需进行归一化处理(如 Min-Max scaling)
数据聚合:对高维度数据进行分组聚合(如按时间、区域分组)
2. 颜色选择与渐变效果
颜色映射选择:
连续型数据:推荐使用viridis(默认)、plasma等 perceptually uniform 配色
正负值数据:使用coolwarm、RdBu等双色渐变方案
分类数据:使用tab10、Set3等离散色板
渐变控制:通过vmin、vmax参数控制颜色映射范围,使用cmap.set_over()和cmap.set_under()处理超出范围的值
3. 图形美化技巧
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 生成示例数据
data = np.random.rand(10, 10)
# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 创建画布和子图
fig, ax = plt.subplots(figsize=(10, 8))
# 绘制热力图
sns.heatmap(data,
cmap="YlGnBu", # 颜色映射
annot=True, # 显示数值
fmt=".2f", # 数值格式
linewidths=.5, # 网格线宽度
cbar_kws={"shrink": .8}, # 颜色条缩放
square=True, # 单元格为正方形
ax=ax) # 指定绘图轴
# 设置标题和坐标轴标签
ax.set_title("示例热力图", fontsize=16)
ax.set_xlabel("X轴标签", fontsize=12)
ax.set_ylabel("Y轴标签", fontsize=12)
# 调整刻度标签旋转角度
plt.xticks(rotation=45)
plt.yticks(rotation=0)
# 添加注释
plt.text(5, -0.5, "这是一个注释", fontsize=10, color='red')
plt.tight_layout()
plt.show()
4. 高级技巧
聚类热力图:使用seaborn.clustermap()同时进行层次聚类和热力图展示
自定义颜色条:通过cbar参数自定义颜色条位置、标签和刻度
子图组合:将热力图与其他图表(如柱状图、折线图)组合展示多维数据
五、章节总结
本章节系统介绍了热力图的核心概念、应用场景及 Python 实现方法:
核心作用:通过颜色映射直观展示二维数据的数值分布和模式
信息价值:可反映数值大小、分布特征、关联关系等多维度信息
应用领域:广泛应用于地理信息、交通、市场分析等多个领域
技术要点:数据预处理、颜色映射选择、图形美化是绘制高质量热力图的关键
在实际应用中,需根据数据特性和分析目标选择合适的颜色方案和可视化参数,同时注意避免数据过载和视觉误导。建议结合具体业务场景多做练习,以掌握热力图的最佳实践。
暂无评论内容