使用Matplotlib绘制多数组频谱图时遇TypeError错误求助
问题分析与解决方案
错误原因
你遇到的TypeError由两个核心问题导致:
plt.specgram()默认仅处理一维时间序列数据,你传入的是10×10的二维数组,不符合函数输入要求。- 调用
specgram时未指定Fs(采样频率)参数,函数内部默认值为None,导致计算pad_xextent时出现int / NoneType的非法运算。
修正方案
方案1:绘制单通道频谱图
从二维数组中提取一维时间序列(示例取第一行),同时指定采样频率Fs(根据数据实际采样率设置,示例设为100):
import matplotlib.pyplot as plt import numpy as np # 你的二维数组 values = np.array([[ 0. , 35.34028168, 36.09317546, 20.88056919, 35.65257548, 36.39835111, 29.89568243, 34.94770207, 36.03834023, 36.51054007], [35.34028168, 0. , 36.31999524, 34.455879 , 35.46084735, 35.99851703, 35.23984878, 35.98339627, 35.87905754, 36.08155069], [36.09317546, 36.31999524, 0. , 35.68280382, 36.11374003, 35.30407355, 35.97087692, 36.20023994, 35.75066441, 36.01957597], [20.88056919, 34.455879 , 35.68280382, 0. , 24.76405132, 36.31596819, 30.47948816, 36.27410762, 36.30076717, 35.76478691], [35.65257548, 35.46084735, 36.11374003, 24.76405132, 0. , 36.17666549, 29.51602419, 36.33520073, 36.21391866, 36.19753349], [36.39835111, 35.99851703, 35.30407355, 36.31596819, 36.17666549, 0. , 36.22994817, 36.32591538, 36.05558867, 36.20784639], [29.89568243, 35.23984878, 35.97087692, 30.47948816, 29.51602419, 36.22994817, 0. , 36.14432269, 36.19523145, 35.40707841], [34.94770207, 35.98339627, 36.20023994, 36.27410762, 36.33520073, 36.32591538, 36.14432269, 0. , 36.05260398, 36.38549268], [36.03834023, 35.87905754, 35.75066441, 36.30076717, 36.21391866, 36.05558867, 36.19523145, 36.05260398, 0. , 35.92987568], [36.51054007, 36.08155069, 36.01957597, 35.76478691, 36.19753349, 36.20784639, 35.40707841, 36.38549268, 35.92987568, 0. ]]) # 提取第一行作为一维时间序列,指定采样频率Fs=100 plt.specgram(values[0], Fs=100) plt.title("单通道频谱图") plt.xlabel("时间 (s)") plt.ylabel("频率 (Hz)") plt.colorbar(label="功率谱密度 (dB/Hz)") plt.show()
方案2:绘制所有通道的频谱图(子图布局)
如果需要可视化二维数组中所有行的频谱,可通过循环生成子图:
import matplotlib.pyplot as plt import numpy as np values = np.array([[ 0. , 35.34028168, 36.09317546, 20.88056919, 35.65257548, 36.39835111, 29.89568243, 34.94770207, 36.03834023, 36.51054007], [35.34028168, 0. , 36.31999524, 34.455879 , 35.46084735, 35.99851703, 35.23984878, 35.98339627, 35.87905754, 36.08155069], [36.09317546, 36.31999524, 0. , 35.68280382, 36.11374003, 35.30407355, 35.97087692, 36.20023994, 35.75066441, 36.01957597], [20.88056919, 34.455879 , 35.68280382, 0. , 24.76405132, 36.31596819, 30.47948816, 36.27410762, 36.30076717, 35.76478691], [35.65257548, 35.46084735, 36.11374003, 24.76405132, 0. , 36.17666549, 29.51602419, 36.33520073, 36.21391866, 36.19753349], [36.39835111, 35.99851703, 35.30407355, 36.31596819, 36.17666549, 0. , 36.22994817, 36.32591538, 36.05558867, 36.20784639], [29.89568243, 35.23984878, 35.97087692, 30.47948816, 29.51602419, 36.22994817, 0. , 36.14432269, 36.19523145, 35.40707841], [34.94770207, 35.98339627, 36.20023994, 36.27410762, 36.33520073, 36.32591538, 36.14432269, 0. , 36.05260398, 36.38549268], [36.03834023, 35.87905754, 35.75066441, 36.30076717, 36.21391866, 36.05558867, 36.19523145, 36.05260398, 0. , 35.92987568], [36.51054007, 36.08155069, 36.01957597, 35.76478691, 36.19753349, 36.20784639, 35.40707841, 36.38549268, 35.92987568, 0. ]]) # 设置子图布局:5行2列 fig, axes = plt.subplots(5, 2, figsize=(12, 15)) axes = axes.flatten() Fs = 100 # 采样频率 for i in range(len(values)): axes[i].specgram(values[i], Fs=Fs) axes[i].set_title(f"通道 {i+1} 频谱图") axes[i].set_xlabel("时间 (s)") axes[i].set_ylabel("频率 (Hz)") plt.tight_layout() plt.show()
关键说明
Fs参数必须指定,它代表数据的采样频率(单位:Hz),需根据数据采集的实际情况调整。specgram的输入必须是一维数组,若为二维数组,需明确处理每一个维度的序列。
内容的提问来源于stack exchange,提问作者Aditya Bhandwalkar
相关产品推荐
相关产品推荐

