我想将时间与频率的关系绘制为x和y轴,但也是由(x,y)而非(时间,频率)点的绘图强度指定的第三个参数。 [实际上,我不想在3D可视化中使用第三轴,而是想要像2D绘图一样,第三轴的振幅由(x,y)处的强度(颜色)值控制。
有人可以建议我类似我要找的东西吗?这些图实际上称为动态光谱。
PS:我在python离线绘图。我已经通过了https://plot.ly/python/,但我仍然不确定哪个会符合我的目的。
请提出一些有助于我完成上述工作的内容:)
答案 0 :(得分:2)
这是用于以图形方式计算和可视化频谱图的代码,我使用以下音频文件测试了该代码:vignesh.wav 该代码已在Jupyter Notebook中使用python 3.6进行了测试
# Full example
# plotly offline
import plotly.offline as pyo
from plotly.offline import init_notebook_mode #to plot in jupyter notebook
import plotly.graph_objs as go
init_notebook_mode() # init plotly in jupyter notebook
from scipy.io import wavfile # scipy library to read wav files
AudioName = "vignesh.wav" # Audio File
fs, Audiodata = wavfile.read(AudioName)
Audiodata = Audiodata / (2.**15) # Normalized between [-1,1]
#Spectrogram
from scipy import signal
plt.figure()
N = 512 #Number of point in the fft
w = signal.blackman(N)
freqs, bins, Pxx = signal.spectrogram(Audiodata, fs,window = w,nfft=N)
# Plot with plotly
trace = [go.Heatmap(
x= bins,
y= freqs,
z= 10*np.log10(Pxx),
colorscale='Jet',
)]
layout = go.Layout(
title = 'Spectrogram with plotly',
yaxis = dict(title = 'Frequency'), # x-axis label
xaxis = dict(title = 'Time'), # y-axis label
)
fig = go.Figure(data=trace, layout=layout)
pyo.iplot(fig, filename='Spectrogram')
答案 1 :(得分:1)
我建议使用pcolormesh图
import matplotlib.pyplot as mp
import numpy as np
# meshgrid your timevector to get it in the desired format
X, Y = np.meshgrid(timevector, range(num_of_frequency_bins))
fig1, ax1 = mp.subplots()
Plothandle = mp.pcolormesh(X, Y, frequencies, cmap=mp.cm.jet, antialiased=True, linewidth=0)
而num_of_frequency_bins
显示在y轴上的频率数量。例如,从0Hz到1000Hz,分辨率为10Hz,您将不得不这样做:range(0,1000,10)
抗锯齿仅用于外观,与线宽相同。
由于非线性灰度,通常不推荐使用Colormap jet,但在频域中通常使用它。因此我在这里使用它。但是python也有一些不错的线性灰度色标图!
关于使用plotly的主题:如果你只想要一个静态图像,你不必使用plotly。如果你想要一个交互式图像,你可以在这里拖动轴和这样的东西,你应该看看情节。