python,matplotlib:谱图数据数组值与谱图图不匹配

努科拉斯

我正在使用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”数据数组(即每个段的频谱图数据值)是通过第一种方法生成的,并在第二种方法中重复使用的。

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

附言:我意识到我的NFFT值不是平方数,但是在编码的这一阶段并不重要。

PPS我不知道什么是“ imN”数组(从pyplot.specgram返回的第四个变量),以及它的用途是...。

乔·金顿

首先,让我们展示您正在描述的示例,以便其他人

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()

在此处输入图片说明

imshowpcolormesh

最后,请注意,我们显示的示例未应用插值,而原始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()

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Matlab功率谱图

来自分类Dev

用matplotlib谱图进行绘图?

来自分类Dev

秘谱图使用问题

来自分类Dev

更改谱图图背景颜色

来自分类Dev

从功率谱生成热图,Matlab

来自分类Dev

R中的基因表达谱图

来自分类Dev

在.wav文件的窗口上计算功率谱图

来自分类Dev

使用matplotlib从Python图获取数据,然后保存到数组

来自分类Dev

python matplotlib:使用预先计算的光谱数据数组的光谱图

来自分类Dev

matplotlib数组的空白图

来自分类Dev

如何通过计算合并窗口中的功率谱来绘制信号的频谱图?

来自分类Dev

MATLAB中的3-D图,其中包含:时间,频率和功率谱密度

来自分类Dev

屏蔽饼图matplotlib中的数据值

来自分类Dev

python matplotlib图成rgba数组

来自分类Dev

Matplotlib,usetex:Colorbar的字体与图的字体不匹配

来自分类Dev

Matplotlib,usetex:Colorbar的字体与图的字体不匹配

来自分类Dev

Matlab图例与图不匹配

来自分类Dev

Matplotlib:将背景颜色图与熊猫列值匹配

来自分类Dev

Google柱形图-柱值与轴不匹配

来自分类Dev

Matplotlib 颜色图值转换

来自分类Dev

matplotlib 中的离散数据图

来自分类Dev

使用子图时,Seaborn热图宽度不匹配

来自分类Dev

Python Matplotlib plt.show()不返回图

来自分类Dev

从Seaborn对图获取数据数组

来自分类常见问题

Python Netgraph Matplotlib刷新图

来自分类Dev

自动保存图,python,matplotlib

来自分类Dev

Python Matplotlib频率像素图

来自分类Dev

Python Matplotlib图像+点图

来自分类Dev

Python Netgraph Matplotlib刷新图