从农业数据到用户行为分析: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的压力异常

维护团队可以优先检查这些异常点,实现预测性维护,避免意外停机。结合时间序列数据,还可以追踪设备健康状况的变化趋势。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐