查看全课大纲(第 70 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

矩阵绘图

约 7 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析中,我们常常需要观察和理解二维表格(矩阵)数据中数值的分布和模式。矩阵绘图,特别是热力图(Heatmap),通过将矩阵中的数值映射为颜色,为我们提供了一种直观的可视化方式,能够在一个平面上同时展示三个维度的信息:行、列以及单元格的值。本节将学习如何使用Matplotlib的imshow函数绘制热力图,并掌握颜色主题的配置方法。

💡 核心导读

  • 热力图(Heatmap):一种将矩阵数据可视化为颜色块的图表,用于揭示数据中的模式、关联和异常。
  • plt.imshow():Matplotlib中用于显示图像或矩阵数据的主要函数,可将其数值映射到颜色。
  • 颜色映射(Colormap):定义了数值到颜色转换规则的集合,不同的cmap参数可以改变热力图的视觉风格和含义。
  • 颜色条(Colorbar):热力图的“图例”,通过颜色条可以解读图中颜色对应的具体数值范围。

1. 什么是矩阵绘图(热力图)

矩阵绘图,通常被称为热力图(Heatmap),是一种将二维矩阵或表格数据可视化的有效方法。它将矩阵中的每个数值映射到一个颜色,从而将抽象的数字矩阵转化为直观的彩色图像。

热力图的核心价值在于它能同时呈现三个维度的信息:

  1. X轴(横轴):通常代表数据的列,如时间序列中的年份。
  2. Y轴(纵轴):通常代表数据的行,如时间序列中的月份。
  3. 颜色(Z值):代表矩阵中对应位置(行,列)的数值大小,如乘客数量、温度、销售额等。

通过观察颜色的深浅或色调变化,我们可以快速识别出数据中的高点、低点、趋势和集群模式。例如,在分析“年份-月份-乘客数量”数据时,热力图能让我们一眼看出哪一年、哪几个月的客流量最大(颜色最亮或最深,取决于颜色映射)。

2. 使用 plt.imshow() 绘制基础热力图

Matplotlib库提供了plt.imshow()函数来绘制热力图。其基本用法是传入一个二维数组(矩阵)数据。

# 引入必要的库
import matplotlib.pyplot as plt
import numpy as np

# 使用非交互式后端,确保代码在任何环境下都能运行
plt.switch_backend('Agg')

# 构造一个简单的模拟矩阵数据(10行代表10个年份,12列代表12个月份)
# 注意:为保持输出确定性,我们使用硬编码的列表创建数据
data_list = [
    [112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 104, 118],
    [115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 140],
    [145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166],
    [171, 180, 193, 181, 183, 218, 230, 242, 209, 191, 172, 194],
    [196, 196, 236, 235, 229, 243, 264, 272, 237, 211, 180, 201],
    [204, 188, 235, 227, 234, 264, 302, 293, 259, 229, 203, 229],
    [242, 233, 267, 269, 270, 315, 364, 347, 312, 274, 237, 278],
    [284, 277, 317, 313, 318, 374, 413, 405, 355, 306, 271, 306],
    [315, 301, 356, 348, 355, 422, 465, 467, 404, 347, 305, 336],
    [340, 318, 362, 348, 363, 435, 491, 505, 404, 359, 310, 337]
]
data_matrix = np.array(data_list, dtype=np.float64)

print("模拟的乘客数量矩阵(10年 x 12月):")
print(data_matrix)
print(f"矩阵形状: {data_matrix.shape}")
模拟的乘客数量矩阵(10年 x 12月):
[[112. 118. 132. 129. 121. 135. 148. 148. 136. 119. 104. 118.]
 [115. 126. 141. 135. 125. 149. 170. 170. 158. 133. 114. 140.]
 [145. 150. 178. 163. 172. 178. 199. 199. 184. 162. 146. 166.]
 [171. 180. 193. 181. 183. 218. 230. 242. 209. 191. 172. 194.]
 [196. 196. 236. 235. 229. 243. 264. 272. 237. 211. 180. 201.]
 [204. 188. 235. 227. 234. 264. 302. 293. 259. 229. 203. 229.]
 [242. 233. 267. 269. 270. 315. 364. 347. 312. 274. 237. 278.]
 [284. 277. 317. 313. 318. 374. 413. 405. 355. 306. 271. 306.]
 [315. 301. 356. 348. 355. 422. 465. 467. 404. 347. 305. 336.]
 [340. 318. 362. 348. 363. 435. 491. 505. 404. 359. 310. 337.]]
矩阵形状: (10, 12)

接下来,我们使用plt.imshow()来可视化这个矩阵。默认的颜色映射是’viridis’。

# 引入必要的库并设置后端
import matplotlib.pyplot as plt
import numpy as np
plt.switch_backend('Agg')

# 重新构造相同的确定性数据
data_list = [
    [112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 104, 118],
    [115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 140],
    [145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166],
    [171, 180, 193, 181, 183, 218, 230, 242, 209, 191, 172, 194],
    [196, 196, 236, 235, 229, 243, 264, 272, 237, 211, 180, 201],
    [204, 188, 235, 227, 234, 264, 302, 293, 259, 229, 203, 229],
    [242, 233, 267, 269, 270, 315, 364, 347, 312, 274, 237, 278],
    [284, 277, 317, 313, 318, 374, 413, 405, 355, 306, 271, 306],
    [315, 301, 356, 348, 355, 422, 465, 467, 404, 347, 305, 336],
    [340, 318, 362, 348, 363, 435, 491, 505, 404, 359, 310, 337]
]
data_matrix = np.array(data_list, dtype=np.float64)

# 绘制基础热力图(不带颜色条)
plt.figure(figsize=(8, 6))
plt.imshow(data_matrix)  # 核心绘图函数
plt.title('基础热力图(未添加颜色条)')
plt.xlabel('月份索引 (0-11)')
plt.ylabel('年份索引 (0-9)')
plt.tight_layout()
# 在实际环境中可以使用 plt.show(),此处为讲义演示,我们关闭图形
plt.close()

运行上述代码会生成一个彩色图像,但我们无法确切知道黄色、绿色、蓝色分别对应多大的数值。这就需要引入颜色条。

3. 添加颜色条与解读

颜色条(Colorbar)是热力图的必备组件,它提供了颜色到数值的映射参考。使用plt.colorbar()函数可以轻松添加。

# 引入必要的库并设置后端
import matplotlib.pyplot as plt
import numpy as np
plt.switch_backend('Agg')

# 重新构造相同的确定性数据
data_list = [
    [112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 104, 118],
    [115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 140],
    [145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166],
    [171, 180, 193, 181, 183, 218, 230, 242, 209, 191, 172, 194],
    [196, 196, 236, 235, 229, 243, 264, 272, 237, 211, 180, 201],
    [204, 188, 235, 227, 234, 264, 302, 293, 259, 229, 203, 229],
    [242, 233, 267, 269, 270, 315, 364, 347, 312, 274, 237, 278],
    [284, 277, 317, 313, 318, 374, 413, 405, 355, 306, 271, 306],
    [315, 301, 356, 348, 355, 422, 465, 467, 404, 347, 305, 336],
    [340, 318, 362, 348, 363, 435, 491, 505, 404, 359, 310, 337]
]
data_matrix = np.array(data_list, dtype=np.float64)

# 绘制带颜色条的热力图
plt.figure(figsize=(9, 6))
img = plt.imshow(data_matrix)  # 保存imshow返回的对象
plt.title('年份-月份乘客数量热力图(模拟数据)')
plt.xlabel('月份索引 (0-11代表1-12月)')
plt.ylabel('年份索引 (0-9代表连续10年)')

# 添加颜色条,并为其设置标签
cbar = plt.colorbar(img, label='乘客数量(模拟值)')

plt.tight_layout()
# 在实际环境中可以使用 plt.show(),此处为讲义演示,我们关闭图形
plt.close()

print("热力图已生成,并添加了颜色条。")
print("观察颜色条可知:颜色越偏向黄色,乘客数量越多;颜色越偏向深紫色,乘客数量越少。")
热力图已生成,并添加了颜色条。
观察颜色条可知:颜色越偏向黄色,乘客数量越多;颜色越偏向深紫色,乘客数量越少。

现在,通过颜色条我们可以清晰地解读图像:在模拟数据中,右下角区域(对应后期年份的夏季月份)颜色最亮(黄),表示乘客数量最多;左上角区域颜色较深(紫),表示乘客数量较少。这直观地展示了乘客数量随时间(年份)和季节(月份)的增长趋势。

4. 探索不同的颜色映射主题

Matplotlib提供了丰富的颜色映射(Colormap)主题,适用于不同的数据和场景(如顺序数据、发散数据)。通过imshow()的cmap参数可以指定颜色主题。

# 引入必要的库并设置后端
import matplotlib.pyplot as plt
import numpy as np
plt.switch_backend('Agg')

# 重新构造相同的确定性数据(小规模,便于演示)
demo_matrix = np.array([
    [1, 4, 7],
    [2, 5, 8],
    [3, 6, 9]
], dtype=np.float64)

# 尝试三种不同的颜色主题
fig, axes = plt.subplots(1, 3, figsize=(12, 3.5))

# 1. 使用 'gnuplot' 主题(紫-黄)
im0 = axes[0].imshow(demo_matrix, cmap='gnuplot')
axes[0].set_title("cmap: 'gnuplot'")
fig.colorbar(im0, ax=axes[0])

# 2. 使用 'ocean' 主题(深蓝-浅蓝)
im1 = axes[1].imshow(demo_matrix, cmap='ocean')
axes[1].set_title("cmap: 'ocean'")
fig.colorbar(im1, ax=axes[1])

# 3. 使用 'hot' 主题(黑-红-黄)
im2 = axes[2].imshow(demo_matrix, cmap='hot')
axes[2].set_title("cmap: 'hot'")
fig.colorbar(im2, ax=axes[2])

plt.tight_layout()
# 在实际环境中可以使用 plt.show(),此处为讲义演示,我们关闭图形
plt.close()

print("演示了三种颜色映射主题:'gnuplot', 'ocean', 'hot'。")
print("可以通过 plt.cm.<name> 或字符串名称(如 'viridis', 'plasma', 'coolwarm')来指定cmap。")
演示了三种颜色映射主题:'gnuplot', 'ocean', 'hot'。
可以通过 plt.cm.<name> 或字符串名称(如 'viridis', 'plasma', 'coolwarm')来指定cmap。

选择合适的颜色映射非常重要。例如:

  • 'viridis'(默认):感知均匀,对色盲友好,适合表示顺序数据。
  • 'coolwarm':发散色系,适合显示有正负或相对于中心值偏差的数据。
  • 'hot':黑色到亮黄色,能很好地突出高值区域。

📝 动手练一练

  1. 概念辨析:热力图(Heatmap)主要用来可视化什么类型的数据结构?它能同时展示几个维度的信息?请举例说明。
👉 点击查看参考答案

热力图主要用于可视化二维矩阵或表格数据。它能同时展示三个维度的信息:

  • X轴维度:通常代表列标签(如不同的年份、产品类别)。
  • Y轴维度:通常代表行标签(如不同的月份、地区)。
  • 颜色维度(Z值):代表矩阵中对应(行,列)位置的数值(如销售额、温度、相关系数)。

例如,一个“城市-月份-平均气温”的数据表,用热力图画出来,X轴是1月到12月,Y轴是北京、上海、广州等城市,颜色深浅代表温度高低,一眼就能看出哪个城市在哪个季节最热或最冷。

  1. 动手实践:假设你有一个3x4的矩阵,代表三个部门(A, B, C)在四个季度(Q1, Q2, Q3, Q4)的业绩得分(分数范围1-10)。请用热力图将其可视化,并为X轴和Y轴设置正确的刻度标签(部门名和季度名),而不是默认的数字索引。提示:使用plt.xticks()和plt.yticks()函数。
👉 点击查看参考答案
import matplotlib.pyplot as plt
import numpy as np
plt.switch_backend('Agg')

# 构造业绩得分矩阵
performance = np.array([
    [8, 7, 9, 6],  # 部门A
    [5, 8, 7, 9],  # 部门B
    [9, 6, 8, 10]  # 部门C
])

# 定义刻度标签
departments = ['Dept A', 'Dept B', 'Dept C']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']

plt.figure(figsize=(6, 4))
img = plt.imshow(performance, cmap='YlOrRd')  # 使用黄-橙-红色系
plt.colorbar(img, label='业绩得分')

# 设置刻度位置和标签
plt.xticks(range(len(quarters)), quarters)
plt.yticks(range(len(departments)), departments)

plt.title('部门季度业绩热力图')
plt.tight_layout()
plt.close()

print("热力图已创建,X轴标签为季度,Y轴标签为部门。")
热力图已创建,X轴标签为季度,Y轴标签为部门。

从图中可以直观比较不同部门在不同季度的表现。

本章小结

本节我们学习了数据可视化中一个强大的工具——矩阵绘图(热力图)。热力图通过颜色编码,将二维数据矩阵转化为直观的图像,非常适合用于观察数据的分布、模式、相关性以及识别异常值。

📋 行动清单

  • 掌握核心函数:熟练使用 plt.imshow(matrix) 绘制基础热力图。
  • 必备颜色条:牢记绘制热力图后,务必使用 plt.colorbar() 添加颜色条,否则图像无法解读。
  • 尝试不同主题:根据你的数据特性(顺序、发散),在 Matplotlib官方色彩映射 中选择合适的 cmap 参数,例如 'viridis', 'plasma', 'coolwarm'。
  • 优化图表可读性:使用 plt.xticks() 和 plt.yticks() 将坐标轴上的数字索引替换为有意义的文本标签(如年份、月份、类别名称)。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:矩阵绘图
    PDF · 190KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载