首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3D Python谱图(如matlab的谱图函数)

3D Python谱图(如matlab的谱图函数)
EN

Stack Overflow用户
提问于 2019-06-27 10:12:34
回答 2查看 6.8K关注 0票数 5

我的问题如下:

我有一个光谱图(scipy.fftpack.fft)所需要的所有值。我想在python中创建一个三维谱图。

在MATLAB中,这是一个非常简单的任务,而在python中,这似乎要复杂得多。我尝试了mayavi,3D绘图matplotlib,但我没有做到这一点。

谢谢

我的代码:

代码语言:javascript
复制
import numpy as np
import pandas as pd
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.collections import PolyCollection

fs = 11240.
t = 10
time = np.arange(fs*t) / fs
frequency = 1000.
mysignal = np.sin(2.0 * np.pi * frequency * time)

nperseg = 2**14
noverlap = 2**13
f, t, Sxx = signal.spectrogram(mysignal, fs, nperseg=nperseg,noverlap=noverlap)

myfilter = (f>800) & (f<1200)

fig,ax = plt.subplots()

plt.pcolormesh(t, f[myfilter], 10*np.log10(Sxx[myfilter, :]), cmap='jet')
plt.show()

fig = plt.figure()
ax = fig.gca(projection='3d')
x = []
y = []

for counter,i in enumerate(f):
    x.append(np.array([i for k in t]))
    y.append(t)

ax.plot_surface(np.array(x), np.array(y), 10.0*np.log10(Sxx), cmap=cm.coolwarm)
plt.show()

类似的未回答问题:How to convert a spectrogram to 3d plot. Python

在python中所需的绘图,如Matlab的图(最后一幅图:https://www.mathworks.com/help/signal/ref/spectrogram.html)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-27 12:06:54

只需将数组设置为正确的形状:

代码语言:javascript
复制
fs = 11240.
t = 10
time = np.arange(fs*t) / fs
frequency = 1000.
mysignal = np.sin(2.0 * np.pi * frequency * time)

nperseg = 2**14
noverlap = 2**13
f, t, Sxx = signal.spectrogram(mysignal, fs, nperseg=nperseg,noverlap=noverlap)

myfilter = (f>800) & (f<1200)

f = f[myfilter]
Sxx = Sxx[myfilter, ...]

fig = plt.figure()
ax = fig.gca(projection='3d')

ax.plot_surface(f[:, None], t[None, :], 10.0*np.log10(Sxx), cmap=cm.coolwarm)
plt.show()
票数 7
EN

Stack Overflow用户

发布于 2021-04-08 11:33:34

这里是@Nils的答案的改编版本,有不同的变量名和完整的导入集。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt 
from scipy import signal # spectrogram function
from matplotlib import cm # colour map

# basic config
sample_rate = 11240.  # 
sig_len_secs = 10
frequency = 2000.

# generate the signal
timestamps_secs = np.arange(samplerate*sig_len_secs) / sample_rate
mysignal = np.sin(2.0 * np.pi * frequency * timestamps_secs) 

# extract the spectrum
freq_bins, timestamps, spec = signal.spectrogram(mysignal, sample_rate)

# 3d plot
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(freq_bins[:, None], timestamps[None, :], 10.0*np.log10(spec), cmap=cm.coolwarm)
plt.show()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56788798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档