gpt4 book ai didi

python - 如何以与 pylab 的 specgram() 相同的方式绘制频谱图?

转载 作者:太空狗 更新时间:2023-10-29 17:42:24 27 4
gpt4 key购买 nike

在 Pylab 中,specgram() 函数为给定的振幅列表创建一个频谱图,并自动为该频谱图创建一个窗口。

我想生成频谱图(瞬时功率由 Pxx 给出),通过在其上运行边缘检测器对其进行修改,然后绘制结果。

(Pxx, freqs, bins, im) = pylab.specgram( self.data, Fs=self.rate, ...... )

问题是,每当我尝试使用 imshow 甚至 NonUniformImage 绘制修改后的 Pxx 时,我都会遇到以下错误消息。

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/image.py:336: UserWarning: Images are not supported on non-linear axes. warnings.warn("Images are not supported on non-linear axes.")

例如,下面是我正在处理的部分代码。

    # how many instantaneous spectra did we calculate
(numBins, numSpectra) = Pxx.shape

# how many seconds in entire audio recording
numSeconds = float(self.data.size) / self.rate


ax = fig.add_subplot(212)
im = NonUniformImage(ax, interpolation='bilinear')

x = np.arange(0, numSpectra)
y = np.arange(0, numBins)
z = Pxx
im.set_data(x, y, z)
ax.images.append(im)
ax.set_xlim(0, numSpectra)
ax.set_ylim(0, numBins)
ax.set_yscale('symlog') # see http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_yscale
ax.set_title('Spectrogram 2')

真题

如何使用 matplotlib/pylab 绘制具有对数 y 轴的类图像数据?

最佳答案

使用pcolorpcolormeshpcolormesh 速度要快得多,但仅限于直线网格,而 pcolor 可以处理任意形状的单元格。 specgram 使用 pcolormesh,如果我没记错的话。 (它使用 imshow。)

举个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

z = np.random.random((11,11))
x, y = np.mgrid[:11, :11]

fig, ax = plt.subplots()
ax.set_yscale('symlog')
ax.pcolormesh(x, y, z)
plt.show()

enter image description here

您看到的差异是由于绘制了 specgram 返回的“原始”值。 specgram 实际绘制的是缩放版本。

import matplotlib.pyplot as plt
import numpy as np

x = np.cumsum(np.random.random(1000) - 0.5)

fig, (ax1, ax2) = plt.subplots(nrows=2)
data, freqs, bins, im = ax1.specgram(x)
ax1.axis('tight')

# "specgram" actually plots 10 * log10(data)...
ax2.pcolormesh(bins, freqs, 10 * np.log10(data))
ax2.axis('tight')

plt.show()

enter image description here

请注意,当我们使用 pcolormesh 绘图时,没有插值。 (这是 pcolormesh 的一部分——它只是矢量矩形而不是图像。)

如果你想要对数尺度的东西,你可以使用 pcolormesh :

import matplotlib.pyplot as plt
import numpy as np

x = np.cumsum(np.random.random(1000) - 0.5)

fig, (ax1, ax2) = plt.subplots(nrows=2)
data, freqs, bins, im = ax1.specgram(x)
ax1.axis('tight')

# We need to explictly set the linear threshold in this case...
# Ideally you should calculate this from your bin size...
ax2.set_yscale('symlog', linthreshy=0.01)

ax2.pcolormesh(bins, freqs, 10 * np.log10(data))
ax2.axis('tight')

plt.show()

enter image description here

关于python - 如何以与 pylab 的 specgram() 相同的方式绘制频谱图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15961979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com