当前位置: 首页 > news >正文

一周学会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()

运行效果:

http://www.dtcms.com/a/328985.html

相关文章:

  • Date/Calendar/DateFormat/LocalDate
  • 分段锁和限流的间接实现
  • Mundi.ai: AI原生GIS
  • 无障碍为什么会读取data-fileid属性,而不读取aria-label属性
  • 【Java虚拟机】JVM内存模型
  • OpenCV常见问题汇总
  • XML头部声明发送者信息的实现方法
  • k8s基本概念
  • vue3:customRef 自定义ref
  • 深度学习模型实现高效公平调度-MU-MIMO场景
  • 面试实战 问题二十九 Java 值传递与引用传递的区别详解
  • 解决Vscode每次连接ssh登入需要输入密码问题(免密登入)
  • NLP自然语言处理: FastText工具与迁移学习基础详解
  • Maven配置Docker插件推送至远程私有仓库
  • 【论文笔记】DOC: Improving Long Story Coherence With Detailed Outline Control
  • Linux应用软件编程---UI技术(frambuffer、内存映射、函数封装、打印各类图形)
  • 数据结构初阶(12)排序算法—插入排序(插入、希尔)(动图演示)
  • 【Datawhale AI 夏令营】金融文档分析检索增强生成系统的架构演变与方法论进展
  • CAN仲裁机制的原理
  • Android中获取状态栏高度
  • 用好Spring AI向量存储,全面释放AI潜能:打造高效RAG应用的加速引擎
  • Jetson NX Python环境搭建:使用APT轻松安装NumPy, scikit-learn, OpenCV
  • 【OSPP 开源之夏】Good First issue 第一步—— openEuler Embedded 计划
  • 机器学习⑤【线性回归(Linear Regression】
  • 记录RK3588的docker中启动rviz2报错
  • C++11新特性详解:从列表初始化到线程库
  • Linux系统编程Day13 -- 程序地址空间(进阶)
  • uniapp组件的开关选择器可以这个携带多参数
  • CVPR2025敲门砖丨机器人结合多模态+时空Transformer直冲高分,让你的论文不再灌水
  • docker network 与host的区别