使用plotly的动态光谱

时间:2016-08-01 14:52:46

标签: python plotly

我想将时间与频率的关系绘制为x和y轴,但也是由(x,y)而非(时间,频率)点的绘图强度指定的第三个参数。 [实际上,我不想在3D可视化中使用第三轴,而是想要像2D绘图一样,第三轴的振幅由(x,y)处的强度(颜色)值控制。

有人可以建议我类似我要找的东西吗?这些图实际上称为动态光谱。

PS:我在python离线绘图。我已经通过了https://plot.ly/python/,但我仍然不确定哪个会符合我的目的。

请提出一些有助于我完成上述工作的内容:)

2 个答案:

答案 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。如果你想要一个交互式图像,你可以在这里拖动轴和这样的东西,你应该看看情节。