从农业数据到用户行为分析:matplotlib热力图的7个真实应用案例
从农业数据到用户行为分析:matplotlib热力图的7个真实应用案例
在数据分析领域,可视化工具的价值不言而喻。matplotlib作为Python生态中最经典的可视化库,其热力图功能尤其适合展示复杂数据中的模式和关联。不同于简单的折线图或柱状图,热力图通过色彩梯度直观呈现数据矩阵,让分析者一眼就能识别出高值区、低值区以及潜在的相关性模式。
热力图的应用场景远比许多人想象的广泛。从传统农业的产量分析,到互联网产品的用户行为追踪,再到金融市场的波动监测,这种看似简单的色块矩阵正在各行各业发挥着重要作用。本文将深入7个真实业务场景,展示如何用matplotlib的热力图解决实际问题,每个案例都包含可复用的代码片段和数据集处理技巧。
1. 农业产量分析与种植优化
农业数据集通常包含多个维度的信息:不同作物在不同农场、不同年份的产量数据。传统的表格形式难以快速发现规律,而热力图可以将这些复杂关系可视化。
import matplotlib.pyplot as plt
import numpy as np
# 模拟5种作物在3年间的产量变化(吨/公顷)
crops = ['小麦', '玉米', '水稻', '大豆', '棉花']
years = ['2019', '2020', '2021']
yield_data = np.array([
[5.2, 5.8, 6.1], # 小麦
[7.5, 7.2, 7.9], # 玉米
[6.8, 6.5, 6.3], # 水稻
[2.9, 3.2, 3.5], # 大豆
[3.1, 2.8, 3.4] # 棉花
])
fig, ax = plt.subplots(figsize=(10,6))
im = ax.imshow(yield_data)
# 设置坐标轴
ax.set_xticks(np.arange(len(years)))
ax.set_yticks(np.arange(len(crops)))
ax.set_xticklabels(years)
ax.set_yticklabels(crops)
# 添加数据标签
for i in range(len(crops)):
for j in range(len(years)):
text = ax.text(j, i, yield_data[i, j],
ha="center", va="center", color="w")
ax.set_title("不同作物年度产量对比(吨/公顷)")
fig.colorbar(im, label='产量')
plt.tight_layout()
plt.show()
这个热力图清晰展示了:
- 玉米在所有作物中产量最高
- 大豆产量呈现稳定上升趋势
- 2020年棉花产量异常偏低,可能需要调查气候因素
农业数据分析小技巧:将土壤成分数据(如氮磷钾含量)与产量数据结合,可以找出最适宜特定作物生长的土壤条件。
2. 电商平台用户点击行为分析
电商平台积累了大量用户行为数据,热力图可以帮助产品团队理解用户的注意力分布。下面模拟一个商品详情页的点击热力图:
# 模拟商品页面的点击热度数据
page_grid = np.zeros((10, 8)) # 10行8列的页面布局
# 设置高点击区域(商品主图、购买按钮)
page_grid[2:5, 3:6] = 0.8 # 主图区域
page_grid[7, 2:6] = 1.0 # 购买按钮行
page_grid[8, 3:5] = 0.6 # 收藏按钮
# 添加随机噪声模拟真实数据
page_grid += np.random.normal(0, 0.1, size=page_grid.shape)
page_grid = np.clip(page_grid, 0, 1) # 限制在0-1范围
plt.figure(figsize=(12, 8))
plt.imshow(page_grid, cmap='YlOrRd')
plt.colorbar(label='点击热度')
plt.title("商品详情页点击热力图")
plt.axis('off') # 隐藏坐标轴
plt.show()
分析这类热力图时,需要关注:
- 高热区:用户最关注的元素是否符合设计预期
- 盲区:重要功能是否被忽视
- 异常点:是否有非预期的高点击区域
通过A/B测试不同页面布局的热力图对比,可以科学优化页面设计,提升转化率。
3. 网站流量时段分析
对于内容网站,理解用户的访问时段分布对内容发布时间策略至关重要。以下代码展示如何可视化一周内各时段的访问量:
import pandas as pd
# 生成模拟数据:一周7天,每天24小时的访问量
days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
hours = list(range(24))
traffic = np.random.poisson(100, size=(7, 24)) # 基础流量
# 设置工作日早晚高峰
traffic[:5, 8:10] += 80 # 早高峰
traffic[:5, 18:20] += 60 # 晚高峰
# 周末白天流量较高
traffic[5:, 10:18] += 40
plt.figure(figsize=(14, 6))
plt.imshow(traffic.T, cmap='Purples', aspect='auto') # 转置使天数为x轴
plt.colorbar(label='访问量')
plt.xticks(range(7), days)
plt.yticks(range(24), [f"{h}:00" for h in hours])
plt.title("一周各时段网站访问热力图")
plt.ylabel("小时")
plt.xlabel("星期")
plt.tight_layout()
plt.show()
从这张热力图中可以明显看出:
- 工作日早晚高峰特征明显
- 周末流量分布更均匀
- 凌晨3-5点是全周流量低谷
基于这些洞察,可以优化内容发布时间和服务器资源分配。
4. 零售商品关联分析
超市和零售店常用热力图分析商品之间的关联关系,为货架摆放和促销组合提供依据。下面是一个商品共购矩阵的示例:
# 商品共购矩阵(同时被购买的概率)
products = ['牛奶', '面包', '鸡蛋', '啤酒', '尿布', '纸巾']
co_purchase = np.array([
[1.0, 0.7, 0.6, 0.1, 0.3, 0.4], # 牛奶
[0.7, 1.0, 0.5, 0.2, 0.2, 0.3], # 面包
[0.6, 0.5, 1.0, 0.1, 0.4, 0.2], # 鸡蛋
[0.1, 0.2, 0.1, 1.0, 0.8, 0.1], # 啤酒
[0.3, 0.2, 0.4, 0.8, 1.0, 0.5], # 尿布
[0.4, 0.3, 0.2, 0.1, 0.5, 1.0] # 纸巾
])
fig, ax = plt.subplots(figsize=(10,8))
im = ax.imshow(co_purchase, cmap='Blues')
# 添加标签
ax.set_xticks(np.arange(len(products)))
ax.set_yticks(np.arange(len(products)))
ax.set_xticklabels(products)
ax.set_yticklabels(products)
# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor")
# 添加数值标签
for i in range(len(products)):
for j in range(len(products)):
text = ax.text(j, i, f"{co_purchase[i, j]:.1f}",
ha="center", va="center", color="w")
ax.set_title("商品共购概率热力图")
plt.colorbar(im, label='共购概率')
plt.tight_layout()
plt.show()
这个热力图中最显著的发现是啤酒和尿布之间的强关联(0.8),这就是零售分析中著名的"啤酒与尿布"案例。基于这种洞察,零售商可以:
- 将相关商品摆放在相邻货架
- 设计组合促销方案
- 优化库存管理策略
5. 城市温度变化可视化
气象数据特别适合用热力图展示,下面代码绘制某城市一年内每日温度变化:
# 生成某城市一年温度数据(模拟)
np.random.seed(42)
base_temp = 10 + 15 * np.sin(np.linspace(0, 2*np.pi, 365)) # 季节性波动
daily_var = np.random.normal(0, 3, 365) # 每日波动
temp_data = base_temp + daily_var
temp_data = np.clip(temp_data, -5, 35) # 限制在合理范围
# 按月份组织数据
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
temp_matrix = np.zeros((12, 31)) * np.nan # 用NaN填充空缺
day_counter = 0
for month in range(12):
days_in_month = month_days[month]
temp_matrix[month, :days_in_month] = temp_data[day_counter:day_counter+days_in_month]
day_counter += days_in_month
# 绘制热力图
plt.figure(figsize=(14, 6))
plt.imshow(temp_matrix, cmap='coolwarm', aspect='auto',
extent=[1, 31, 12, 1], vmin=-5, vmax=35)
plt.colorbar(label='温度 (°C)')
plt.yticks(range(1,13), ['1月', '2月', '3月', '4月', '5月', '6月',
'7月', '8月', '9月', '10月', '11月', '12月'])
plt.xlabel("日期")
plt.title("某城市全年每日温度变化热力图")
plt.tight_layout()
plt.show()
这种可视化方式可以直观展示:
- 全年温度变化趋势
- 异常天气出现的时间点
- 不同月份的温度波动范围
城市规划部门可以利用这类分析来预测能源需求,农业领域可用于规划种植和收获时间。
6. 股票市场相关性分析
金融分析师常用热力图研究不同股票或资产类别的相关性。以下代码展示如何可视化股票相关性矩阵:
# 生成5只股票1年的每日收益率相关性矩阵
stocks = ['科技A', '金融B', '消费C', '能源D', '医药E']
# 模拟相关系数矩阵
corr_matrix = np.array([
[1.00, 0.15, 0.30, -0.10, 0.40], # 科技A
[0.15, 1.00, 0.05, 0.20, -0.05], # 金融B
[0.30, 0.05, 1.00, -0.15, 0.25], # 消费C
[-0.10, 0.20, -0.15, 1.00, -0.30],# 能源D
[0.40, -0.05, 0.25, -0.30, 1.00] # 医药E
])
# 绘制热力图
fig, ax = plt.subplots(figsize=(10,8))
im = ax.imshow(corr_matrix, cmap='RdYlGn', vmin=-1, vmax=1)
# 添加元素
ax.set_xticks(np.arange(len(stocks)))
ax.set_yticks(np.arange(len(stocks)))
ax.set_xticklabels(stocks)
ax.set_yticklabels(stocks)
# 添加相关系数标签
for i in range(len(stocks)):
for j in range(len(stocks)):
color = 'black' if abs(corr_matrix[i,j]) < 0.5 else 'white'
text = ax.text(j, i, f"{corr_matrix[i,j]:.2f}",
ha="center", va="center", color=color)
plt.title("股票收益率相关性热力图")
plt.colorbar(im, label='相关系数')
plt.tight_layout()
plt.show()
从这张热力图中可以快速识别:
- 科技A与医药E有较强正相关(0.40)
- 能源D与医药E呈现负相关(-0.30)
- 金融B与其他股票相关性普遍较低
这些洞察对构建分散化投资组合至关重要,帮助投资者降低风险。
7. 工厂设备故障预测
制造业中,热力图可用于监控设备传感器数据,预测潜在故障。以下示例展示多台设备的多指标健康评分:
# 生成10台设备的5项健康指标
devices = [f"设备_{i+1}" for i in range(10)]
metrics = ['振动', '温度', '电流', '噪音', '压力']
# 模拟健康评分(0-1,越高越健康)
health_scores = np.random.beta(2, 2, size=(10, 5))
# 设置一些异常值
health_scores[3, 1] = 0.1 # 设备4温度异常
health_scores[7, 0] = 0.15 # 设备8振动异常
health_scores[2, 4] = 0.2 # 设备3压力异常
# 绘制热力图
plt.figure(figsize=(12, 6))
plt.imshow(health_scores, cmap='RdYlGn', vmin=0, vmax=1)
# 设置坐标轴
plt.xticks(range(5), metrics)
plt.yticks(range(10), devices)
# 添加数值标签
for i in range(10):
for j in range(5):
color = 'black' if health_scores[i,j] > 0.3 else 'white'
text = plt.text(j, i, f"{health_scores[i,j]:.2f}",
ha="center", va="center", color=color)
plt.title("设备健康指标热力图")
plt.colorbar(label='健康评分(1=最佳)')
plt.tight_layout()
plt.show()
这张热力图中,低于0.3的分数(红色区域)标示着潜在问题:
- 设备4的温度异常
- 设备8的振动异常
- 设备3的压力异常
维护团队可以优先检查这些异常点,实现预测性维护,避免意外停机。结合时间序列数据,还可以追踪设备健康状况的变化趋势。
更多推荐



所有评论(0)