一周学会Matplotlib3 Python 数据可视化-绘制热力图(Heatmap)

锋哥原创的Matplotlib3 Python数据可视化视频教程:

2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili

课程介绍

本课程讲解利用python进行数据可视化 科研绘图-Matplotlib,学习Matplotlib图形参数基本设置,绘图参数及主要函数,以及Matplotlib基础绘图,和Matplotlib高级绘图。

绘制热力图(Heatmap)

热力图是一种用颜色编码矩阵数据的可视化方式,特别适合展示二维数据集的数值分布和模式识别。Matplotlib 提供了强大的热力图绘制功能,可以轻松创建专业级的热力图。

热力图的基本原理

热力图通过色彩变化来展示矩阵中每个单元格的数值大小:

  • 高值区域通常用暖色调(红、黄)表示

  • 低值区域通常用冷色调(蓝、绿)表示

  • 中间值区域使用过渡色

使用 Matplotlib 绘制热力图的步骤

  1. 准备数据:创建二维矩阵数据

  2. 创建图形和坐标轴

  3. 使用 imshow() 函数绘制热力图

  4. 添加颜色条(colorbar)

  5. 添加标签、标题和刻度

  6. 可选:在单元格中显示数值

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))彩色图像

关键参数详解

  1. 颜色映射与归一化
  • 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]映射到颜色

  1. 图像显示属性
  • 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')  # 第一行在底部(类似数学坐标系)

  1. 坐标定位
  • extent : 定义图像在坐标轴中的位置 (left, right, bottom, top)

    复制代码
    # 将图像放置在x∈[10,20], y∈[5,15]的区域
    ax.imshow(data, extent=[10, 20, 5, 15])
  • filternorm/filterrad : 抗锯齿滤波器参数(高级用法)。


  1. 其他常用参数
  • 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()

运行效果:

相关推荐
精致先生8 分钟前
Streamlit实现Qwen对话机器人
python·机器人·大模型·streamlit
柯南二号37 分钟前
MacOS 系统计算机专业好用工具安装
开发语言·lua
蜀中廖化1 小时前
机器学习:基于OpenCV和Python的智能图像处理 实战
python·opencv·机器学习
神洛华1 小时前
Lua语言程序设计2:函数、输入输出、控制结构
开发语言·lua
梁辰兴2 小时前
数据结构:串、数组与广义表
开发语言·数据结构·c··数组·广义表
程序员岳焱3 小时前
Java 调用 Python 脚本:实现 HelloWorld
java·后端·python
R-G-B3 小时前
【P27 4-8】OpenCV Python——Mat类、深拷贝(clone、copyTo、copy)、浅拷贝,原理讲解与示例代码
人工智能·python·opencv·浅拷贝·深拷贝·opencv python·mat类
三体世界3 小时前
Mysql基本使用语句(一)
linux·开发语言·数据库·c++·sql·mysql·主键
etcix3 小时前
wrap cpp variant as dll for c to use
java·c语言·开发语言