You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:55:19