如何使用Python绘制直方图,以便x值是光谱的频率?

时间:2014-11-19 21:38:33

标签: python matplotlib fft histogram

我查看了python“matplotlib.pylab”库,并允许我使用“plt.hist”函数绘制直方图。问题是它只需要一个数据参数,即一个数组。在我的例子中,我想绘制傅立叶变换产生的数据的直方图。傅里叶变换显示各种频率的相对数量。所以我可以把这个数量的数组放到“plt.hist”中并获得一个信息图表,但x轴不会以频率为单位。我的猜测是x轴只是数组的索引,但是当我绘制它时,即使这似乎也不正确。 谢谢,

1 个答案:

答案 0 :(得分:3)

制作X直方图的天真答案,时域信号的DFT x

import matplotlib.pyplot as plt
import numpy as np

...
w = np.linspace(0,N*dw-dw,N)   
plt.bar(w, abs(X), align='center', width=dw)
plt.show()

对于看起来很漂亮的情节,你必须考虑X与频率0*dw, 1*dw, ..., (N-1)*dw相关联,并且在一个漂亮的情节中,你通常想要使用范围{{1} },-N*dw/2为你的横纹。

完整答案

+N*dw/2

这是迄今为止的结果

enter image description here

如你所见,这种类型的情节强调DFT的周期性,但通常将DFT绘制在零频率的中心,这可以这样做

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(57)

N = 64 ; dw = 0.2
w = np.linspace(0,N*dw-dw,N)
X = 200 + (np.arange(N)-N/2)**2*np.random.random(N)

plt.bar(w, abs(X), align='center', width=dw)
plt.xticks([i*8*dw for i in range(N/8)]+[N*dw-dw/2])
plt.xlim(-dw/2,N*dw-dw/2)
plt.show()

这就是结果 enter image description here

Post Scriptum

我描述的程序是针对OP需求的良好程序,但我想说w2=np.concatenate((w-N*dw,w)) X2=np.concatenate((X,X) plt.bar(w2, abs(X2), align='center', width=dw) plt.xticks([i*8*dw for i in range(-N/16,1+N/16)]) plt.xlim(-dw*N/2,dw*N/2) plt.show() 数据已经在现场合成,并且与现实生活中的DFT没有相似之处。相反,如果我看到上面的情节,我会对时域中的采样率不足做出评论。