完整代码获取回复“小波分析”即可获取通道
各位小伙伴们!大家好
今天,我想给大家介绍两张图:小波实部时频图和小波方差分布图。它们都来自时间序列的小波分析。
做时间序列分析时,我们常常会问两个问题:
第一,这组数据有没有周期性变化;
第二,这种周期性是不是一直都存在,还是只在某些年份特别明显。
传统方法比如傅里叶分析,更擅长回答总体上有没有周期,但它不太容易告诉我们“这个周期在哪一段时间最明显”。而小波分析最大的优势就在于它能同时从时间和频率/尺度两个角度观察数据,也就是常说的“时频分析”。小波分析最大的特点,是不仅能告诉我们数据是否存在周期,还能告诉我们这个周期是在什么时间出现的,因此非常适合分析像 NDVI、降水、温度这类随时间变化、而且规律会改变的数据。
我们今天要分享一套代码,专门用于输出小波实部时频图和小波方差分布图。这套代码先从 Excel 中读取两列数据,第一列是年份,第二列是指标值。然后利用连续小波变换,对 1 到 30 年尺度范围内的波动特征进行分析。代码选用的是复 Morlet 小波,这是一种在科研中较常用的小波基,适合识别时间序列中的周期振荡。
我们先来看看输出的图是什么样子的。

图1:小波实部时频图

图2:小波方差分布图
小波实部时频图
横轴表示时间,纵轴表示周期尺度,颜色表示小波系数实部的大小和正负。我们可以把它理解为一张“周期活动地图”,在哪一年、在哪个尺度上波动明显,这张图都会显示出来。颜色越深,说明该时间和尺度上的波动越突出;红蓝则表示振荡处于不同相位状态。图上的黑色等值线是为了帮助我们更清楚地看出强波动区域的轮廓。
在解读这张图时,我们重点关注三点:
第一,看某个尺度上是否存在连续色带,这表示该周期是否持续存在;
第二,看色块是否集中在某些年份,这表示周期是否具有阶段性;
第三,看图中是否存在大面积高强度区域,这代表该尺度的波动影响较大。同时要注意,图中的黑色虚线和阴影区是影响锥,落在阴影区内的结果容易受边界效应影响,解释时要谨慎。
例图1解读:
图1展示了数据在不同时间点(横轴为年份)和不同尺度(纵轴为周期尺度,单位为“年”)上的小波系数的实部变化。图中使用了颜色渐变来表示小波系数的强度,红色表示较强的正相位,蓝色表示较强的负相位,白色则表示接近零的区域。
横轴:表示时间,覆盖了从1980年到2025年之间的数据。
纵轴:表示不同的周期尺度,范围从5年到30年。这些尺度代表了信号在不同时期的振荡周期。
颜色图:颜色的深浅反映了小波系数的强度。红色区域表示正的波动(上升趋势),蓝色则表示负的波动(下降趋势)。色块的变化程度和时间变化,反映了在该时期和尺度上的波动强弱。
黑色等值线:等值线代表在同一时刻和同一尺度下,小波系数强度相等的区域。通过这些等值线,可以看出特定时间和尺度上波动的层次结构。
虚线(影响锥COI):虚线表示影响锥区域,说明在此区域外的结果会受到边界效应的影响。因此,图中的影响锥下的区域是相对较为可信的区域。
这张时频图为我们提供了一个关于周期性波动的时变分析。通过分析图中不同时间段的周期尺度(如5年、10年、20年等),我们可以了解某些特定时间内某些周期尺度的波动表现。例如,某一时期,若某个周期尺度上的颜色较深且持续时间较长,说明该时间段在该尺度上的波动较强,可能存在某种主导周期性行为。
从这张图中我们可以得出以下结论:
周期性变化:一些区域表现出强烈的周期性波动,特别是在某些特定年份,例如1990至2000年之间,存在强烈的正负振荡。
趋势分析:通过颜色变化的渐变,可以提取周期性波动的趋势,例如一些尺度周期在2000年以后持续变化,可能表明数据在该时期发生了系统性的变化。
小波方差分布图
小波方差分布图把第一张图中各个尺度上的信息沿时间方向进行了汇总,因此更适合用来判断哪一个周期尺度最重要。横轴是尺度,纵轴是方差值。若某个尺度出现明显峰值,说明这个尺度是该时间序列中的主导周期;如果有多个峰值,就表示序列可能存在多个重要周期。
例图2解读:
图2展示了各周期尺度下的小波方差值,横轴为周期尺度(单位为年),纵轴为小波方差值。小波方差表示在该尺度下波动的强度,值越高,说明该尺度的波动越显著。
横轴:代表不同的周期尺度,从1年到30年。较小的周期尺度对应较短的周期性波动,较大的周期尺度则代表长期周期波动。
纵轴:展示了每个周期尺度上的小波方差。方差高的尺度表明该尺度在信号中的重要性越大,可能是信号的主导周期。
黑色折线:该折线显示了每个尺度上小波方差的变化,标记了各尺度波动强度的分布。
学术解读:
方差图主要用于识别主导周期尺度。从图中的折线可见,随着周期尺度的增大,小波方差迅速上升,并且在15到20年之间达到了一个明显的峰值,之后方差值略有下降。这意味着数据的主导周期尺度大致位于15到20年之间。
这种分布有助于我们识别在时间序列中最显著的振荡周期。较小尺度(如1-5年)波动较小,而较大尺度则逐渐显现出更加显著的周期性波动,可能反映了数据的长期趋势和规律。
应用场景:
这种方法在多种领域中具有广泛应用:
气候变化分析:可以分析气候因子的年际波动,如气温、降水量等数据的周期性变化。
生态学研究:用于分析植物生长、森林覆盖度等生态指标的周期性变化,揭示环境变化对生态系统的影响。
经济学:用于研究经济周期波动,如GDP、消费指数、失业率等宏观经济指标。
水文学:用于分析流域降水量和水位的周期性波动,帮助水资源管理和预测。
多种配色效果:
代码操作流程(小白必看):
1. 安装 Python
首先,您需要安装 Python。您可以从 Python官网下载适合您操作系统的 Python 版本。建议安装 Python 3.11~3.13 版本更稳定一些。相关操作教程可上网查找。不同电脑系统安装不同。
Python官网:https://www.python.org/downloads/
2.安装Python编辑器
推荐安装VS Code、PyCharm 等编辑器,可到官网下载软件安装。
3.安装必要的 Python 库
安装完 Python 和Python编辑器后,您需要安装几个库,这些库是代码中所用到的库。打开终端(Command Prompt 或 Terminal),然后输入以下命令安装这些库:
pip install numpy pandas matplotlib pywt seaborn
4.安装完成后准备数据
我们需要准备数据,数据格式如下:第一列是年份,第二列是指标值。保存Excel格式,将我们的代码和Excel文件放在同一个文件夹内。

5.运行代码
选择下载好的代码文件,复制粘贴您的数据文件,点击运行即可。

6.可自定义配置
在这里可以配置您需要的颜色,直接输入颜色代码在对应的双引号内。

7.自定义配置参数

● 常见报错:
1. python 不是内部或外部命令
这个报错通常出现在 Windows,说明 Python 没有正确加入环境变量 PATH。常见表现是终端输入 python --version 没有返回版本号,而是直接报错。
解决方法是重新安装 Python,并在安装界面勾选 Add Python to PATH。如果已经安装了 Python,也可以手动把 Python 安装目录和 Scripts 目录加入系统环境变量。配置完成后,重新打开命令行,再输入 python --version 和 pip --version 进行检查。
2. pip 不是内部或外部命令
这说明 pip 没有被正确识别,通常与 Python 环境变量未配置好有关。可以先尝试:
python -m pip --version
如果这个命令可以运行,后续安装库时建议改用:
python -m pip install numpy pandas matplotlib seaborn PyWavelets openpyxl
这里要特别注意,您代码里导入的是 pywt,但安装包名称不是 pywt,而是 PyWavelets。同时,因为代码使用了 pd.read_excel() 读取 .xlsx 文件,所以通常还需要安装 openpyxl 作为 Excel 引擎。
3. ModuleNotFoundError: No module named 'pywt'
这是最常见的安装类报错之一。原因是用户误以为安装包叫 pywt,实际上正确安装命令应为:pip install PyWavelets
安装完成后,代码里的 import pywt 才能正常运行。因为您的程序明确调用了 pywt.cwt() 进行连续小波变换,所以这个库缺失时程序无法进入核心计算阶段。
4.ModuleNotFoundError: No module named 'openpyxl'
这是读取 Excel 文件时非常典型的报错。虽然代码中写的是 pd.read_excel(EXCEL_FILE_PATH),但 Pandas 在读取 .xlsx 文件时往往依赖 openpyxl。如果没有安装,就会报这个错误。
解决方法:终端安装:pip install openpyxl
5. ❌ 错误: 找不到真实数据文件 '示范数据.xlsx'
这个并不是 Python 崩溃报错,而是您代码里主动写入的路径检查提示。程序在真正读取数据前,先用 os.path.exists(EXCEL_FILE_PATH) 检查 Excel 文件是否存在;如果不存在,就直接停止运行。
出现这个问题一般有三种原因:
第一,Excel 文件根本不在脚本所在目录;
第二,文件名和代码里设置的不一致;
第三,路径中含有中文空格或层级太深,实际路径写错了。
解决方法是检查这句配置:EXCEL_FILE_PATH = '示范数据.xlsx'确保数据文件和代码在同一个文件夹内。
6. IndexError: single positional indexer is out-of-bounds
原因是 Excel 表格列数不够,比如只读进来了一列,或者数据表为空。因为您的代码默认第 1 列是时间,第 2 列是指标值,所以文件至少要有两列有效数据。
7.ValueError: could not convert string to float
这个错误说明指标列中混入了文本、符号或空单元格,例如“缺失”“—”“无数据”等。小波分析要求输入的是数值型序列,如果第二列不是纯数值,就可能在计算阶段报错。
8.UserWarning: Glyph xxxx missing from current font
这不是致命错误,而是字体警告。您的代码设置了字体列表 ['Times New Roman', 'SimSun', 'Arial', 'sans-serif'],并且还会预先检查字体是否存在;如果系统中缺少某种字体,Matplotlib 会自动降级。
9.PermissionError: [Errno 13] Permission denied
这个错误多发生在保存图片时。您的程序会自动创建输出目录 输出结果,再将图片保存为 png 和 pdf 文件。如果该文件夹正被占用、没有写入权限,或者同名文件正被其他程序打开,就可能报权限错误。
解决方法是:
关闭正在占用图片的程序;
把输出目录改到桌面或其他可写位置;
避免文件名重复被锁定。
10.图能画出来,但颜色很乱或几乎全白
这通常不是代码错,而是数据本身问题。比如:数据长度太短;数据几乎没有波动;数据存在趋势项但未做标准化;尺度范围设得太大。
我的代码将尺度设为 1–30,如果实际数据只有二十几个点,那么大尺度部分本身就不稳定,容易出现解释困难的图形。
解决思路是:
保证数据长度尽量长;必要时先做标准化或去趋势;让 SCALE_MAX 不要明显超过序列有效长度的一半到三分之二。
11.小波方差图一直单调上升
这也是可能出现的现象,不一定是程序错。因为您的方差是基于小波实部平方后按时间平均得到的,如果原始序列具有较强长期趋势,或者低频成分占主导,那么方差图就可能随着尺度增大而持续上升。您当前的方差计算公式正是这样实现的。
若从科研分析角度希望更突出周期峰值,可以考虑:先去趋势;对数据做标准化;或改为分析功率谱而不仅是实部平方。
其他代码报错可微信详细咨询:zhouysh001(八宝粥加油)
完整代码获取回复“小波分析”即可获取通道