当前位置:  开发笔记 > 编程语言 > 正文

python,matplotlib:specgram数据数组值与specgram plot不匹配

如何解决《python,matplotlib:specgram数据数组值与specgramplot不匹配》经验,为你挑选了1个好方法。

我使用matplotlib.pyplot.specgram和matplotlib.pyplot.pcolormesh来制作地震信号的频谱图.

背景信息 - 使用pcolormesh的原因是我需要在光谱图数据阵列上进行算术,然后重新绘制得到的频谱图(对于三分量地震图 - 东,北和垂直 - 我需要计算水平频谱幅度和用水平光谱划分垂直光谱.使用谱图阵列数据比使用单个振幅谱更容易

我发现算术后的谱图有意想不到的值.经过进一步调查后发现,与使用pyplot.pcolormesh制作的频谱图和pyplot.specgram方法返回的数据数据相比,使用pyplot.specgram方法制作的频谱图具有不同的值.两个图/数组都应该包含相同的值,我无法弄清楚它们为什么没有.

示例:的情节

plt.subplot(513)
PxN, freqsN, binsN, imN = plt.specgram(trN.data, NFFT = 20000, noverlap = 0, Fs = trN.stats.sampling_rate, detrend = 'mean', mode = 'magnitude')
plt.title('North')
plt.xlabel('Time [s]')
plt.ylabel('Frequency [Hz]')
plt.clim(0, 150)
plt.colorbar()
#np.savetxt('PxN.txt', PxN)

看起来与情节不同

plt.subplot(514)
plt.pcolormesh(binsZ, freqsZ, PxN)
plt.clim(0,150)
plt.colorbar()

即使"PxN"数据阵列(即每个段的频谱图数据值)由第一种方法产生并在第二种方法中重新使用.

有人知道为什么会这样吗?

PS我意识到我对NFFT的价值不是一个平方数,但在我编码的这个阶段它并不重要.

PPS我不知道"imN"数组(来自pyplot.specgram的第四个返回变量)是什么以及它用于什么......



1> Joe Kington..:

首先,让我们展示一下您所描述的内容的一个例子,以便其他人

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

# Brownian noise sequence
x = np.random.normal(0, 1, 10000).cumsum()

fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(8, 10))

values, ybins, xbins, im = ax1.specgram(x, cmap='gist_earth')
ax1.set(title='Specgram')
fig.colorbar(im, ax=ax1)

mesh = ax2.pcolormesh(xbins, ybins, values, cmap='gist_earth')
ax2.axis('tight')
ax2.set(title='Raw Plot of Returned Values')
fig.colorbar(mesh, ax=ax2)

plt.show()

在此输入图像描述

幅度差异

您会立即注意到绘制值的大小差异.

默认情况下,plt.specgram不会绘制它返回的"原始"值.相反,它将它们缩放为分贝(换句话说,它绘制10 * log10了幅度).如果您不想扩展内容,则需要指定scale="linear".然而,对于频率成分的观察,对数尺度最有意义.

考虑到这一点,让我们模仿specgram:

plotted = 10 * np.log10(values)

fig, ax = plt.subplots()
mesh = ax.pcolormesh(xbins, ybins, plotted, cmap='gist_earth')

ax.axis('tight')
ax.set(title='Plot of $10 * log_{10}(values)$')
fig.colorbar(mesh)

plt.show()

在此输入图像描述

而是使用日志颜色比例

或者,我们可以在图像上使用日志规范并获得类似的结果,但更清楚地传达颜色值在对数标度上:

from matplotlib.colors import LogNorm

fig, ax = plt.subplots()
mesh = ax.pcolormesh(xbins, ybins, values, cmap='gist_earth', norm=LogNorm())

ax.axis('tight')
ax.set(title='Log Normalized Plot of Values')
fig.colorbar(mesh)

plt.show()

在此输入图像描述

imshow VS pcolormesh

最后,请注意我们显示的示例没有应用插值,而原始specgram绘图确实如此. specgram使用imshow,而我们一直在密谋pcolormesh.在这种情况下(常规网格间距)我们可以使用其中之一.

这两个imshowpcolormesh非常不错的选择,在这种情况下.但是,imshow如果您正在使用大型阵列,那么性能会明显提高.因此,即使您不想插值(例如interpolation='nearest'关闭插值),也可以考虑使用它.

举个例子:

extent = [xbins.min(), xbins.max(), ybins.min(), ybins.max()]

fig, ax = plt.subplots()
mesh = ax.imshow(values, extent=extent, origin='lower', aspect='auto',
                 cmap='gist_earth', norm=LogNorm())

ax.axis('tight')
ax.set(title='Log Normalized Plot of Values')
fig.colorbar(mesh)

plt.show()

在此输入图像描述

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有