一周学会Matplotlib3 Python 数据可视化-绘制热力图(Heatmap)
锋哥原创的Matplotlib3 Python数据可视化视频教程:
2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
课程介绍
本课程讲解利用python进行数据可视化 科研绘图-Matplotlib,学习Matplotlib图形参数基本设置,绘图参数及主要函数,以及Matplotlib基础绘图,和Matplotlib高级绘图。
绘制热力图(Heatmap)
热力图是一种用颜色编码矩阵数据的可视化方式,特别适合展示二维数据集的数值分布和模式识别。Matplotlib 提供了强大的热力图绘制功能,可以轻松创建专业级的热力图。
热力图的基本原理
热力图通过色彩变化来展示矩阵中每个单元格的数值大小:
-
高值区域通常用暖色调(红、黄)表示
-
低值区域通常用冷色调(蓝、绿)表示
-
中间值区域使用过渡色
使用 Matplotlib 绘制热力图的步骤
-
准备数据:创建二维矩阵数据
-
创建图形和坐标轴
-
使用
imshow()
函数绘制热力图 -
添加颜色条(colorbar)
-
添加标签、标题和刻度
-
可选:在单元格中显示数值
ax.imshow()
是 Matplotlib 中用于在坐标轴上显示图像的核心方法(ax
通常指 matplotlib.axes.Axes
对象)。它支持多种数据类型(数组、PIL 图像等),并提供了丰富的参数控制图像显示效果。以下是详细解析:
ax.imshow(X, **kwargs)
-
X: 要显示的图像数据(必需参数),支持以下格式:
-
2D 数组:灰度图像(值域范围:
[0, 1]
浮点数或[0, 255]
整数) -
3D 数组:RGB(
shape=(M, N, 3)
)或 RGBA(shape=(M, N, 4)
)彩色图像
-
关键参数详解
-
颜色映射与归一化
-
cmap
: 指定颜色映射(仅用于单通道数据)。ax.imshow(data, cmap='viridis') # 使用内置colormap ax.imshow(data, cmap=plt.cm.hot) # 或通过plt.cm调用
-
norm
: 控制数据到颜色的映射方式。from matplotlib.colors import LogNorm ax.imshow(data, norm=LogNorm(vmin=1, vmax=100)) # 对数归一化
-
vmin
/vmax
: 手动设置颜色映射的数据范围。ax.imshow(data, vmin=0, vmax=10) # 将数据[0,10]映射到颜色
-
图像显示属性
-
aspect
: 控制图像纵横比。ax.imshow(data, aspect='auto') # 自适应坐标轴 ax.imshow(data, aspect='equal') # 像素保持正方形(默认)
-
interpolation
: 像素插值方法(抗锯齿效果)。ax.imshow(data, interpolation='nearest') # 无插值(像素化) ax.imshow(data, interpolation='bilinear') # 双线性平滑
-
alpha
: 透明度(0.0
完全透明,1.0
不透明)。ax.imshow(data, alpha=0.5) # 半透明叠加
-
origin
: 数组原点位置。ax.imshow(data, origin='upper') # 第一行在顶部(默认) ax.imshow(data, origin='lower') # 第一行在底部(类似数学坐标系)
-
坐标定位
-
extent
: 定义图像在坐标轴中的位置(left, right, bottom, top)
。# 将图像放置在x∈[10,20], y∈[5,15]的区域 ax.imshow(data, extent=[10, 20, 5, 15])
-
filternorm
/filterrad
: 抗锯齿滤波器参数(高级用法)。
-
其他常用参数
-
resample
: 重采样方法(已弃用,推荐用interpolation
)。 -
url
: 为图像添加超链接(导出为SVG/PDF时有效)。 -
animated
: 优化动画渲染性能。
返回值
-
返回
matplotlib.image.AxesImage
对象,可用于:-
添加颜色条:
plt.colorbar(im)
-
动态更新图像:
im.set_data(new_data)
-
我们来看一个示例:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
import matplotlib.font_manager as fm
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 创建数据
np.random.seed(42)
data = np.random.rand(8, 10) * 100 # 8x10的随机矩阵
# 创建图形
fig, ax = plt.subplots(figsize=(12, 8), dpi=100)
fig.patch.set_facecolor('#F5F5F5') # 设置背景色
# 创建自定义颜色映射 创建从蓝色(低值)到橙色(高值)的自定义渐变颜色映射
cmap = colors.LinearSegmentedColormap.from_list('custom_cmap',['#2E86C1', '#3498DB', '#85C1E9','#F7F9F9', '#F9E79F', '#F1C40F', '#E67E22'])
# 绘制热力图
"""
cmap:指定颜色映射
aspect='auto':自动调整纵横比
interpolation='nearest':使用最近邻插值,保持单元格边界清晰
"""
heatmap = ax.imshow(data, cmap=cmap, aspect='auto', interpolation='nearest')
# 添加颜色条 颜色条显示颜色与数值的对应关系,shrink参数调整颜色条高度
cbar = fig.colorbar(heatmap, ax=ax, shrink=0.7)
cbar.set_label('数值大小', fontsize=12)
# 设置坐标轴标签
ax.set_xticks(np.arange(data.shape[1]))
ax.set_yticks(np.arange(data.shape[0]))
ax.set_xticklabels([f'特征{i + 1}' for i in range(data.shape[1])], fontsize=10)
ax.set_yticklabels([f'样本{i + 1}' for i in range(data.shape[0])], fontsize=10)
# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")
# 添加标题
ax.set_title("数据特征热力图分析", fontsize=16, pad=20, weight='bold')
# 在单元格中显示数值
for i in range(data.shape[0]):for j in range(data.shape[1]):# 根据背景色亮度调整文本颜色color = 'black' if data[i, j] < 50 else 'white'ax.text(j, i, f'{data[i, j]:.1f}',ha="center", va="center",color=color, fontsize=9, weight='bold')
# 添加网格线
ax.grid(which="minor", color="gray", linestyle='-', linewidth=0.5)
# 添加说明文本
plt.figtext(0.5, 0.01, "热力图展示了不同样本在各个特征维度上的数值分布,颜色越暖表示数值越大",ha="center", fontsize=10, color='#555555')
# 调整布局
plt.tight_layout(pad=3.0)
plt.subplots_adjust(bottom=0.15)
# 显示图形
plt.show()
运行效果: