首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python,matplotlib: specgram数据数组值与散斑图不匹配

python,matplotlib: specgram数据数组值与散斑图不匹配
EN

Stack Overflow用户
提问于 2015-12-08 12:34:19
回答 1查看 4.5K关注 0票数 4

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

背景信息-The之所以使用pcolormesh,是因为我需要对光谱数据阵列做算术运算,然后重新绘制所产生的谱图(对于东、北、垂直三分量地震记录,我需要计算出水平谱幅,并将垂直谱除以水平谱)。使用谱图阵列数据比使用单个振幅谱更容易做到这一点。

我已经发现,在做了我的算术后的光谱图有意想不到的价值。经进一步研究发现,用pyplot.specgram方法制作的谱图图与用pyplot.pcolormesh法制作的谱图图和pyplot.specgram法返回的数据阵列图有不同的值。这两个图/数组都应该包含相同的值,我想不出它们为什么不包含。

例子:……的情节

代码语言:javascript
运行
复制
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)

看起来与…的情节不同

代码语言:javascript
运行
复制
plt.subplot(514)
plt.pcolormesh(binsZ, freqsZ, PxN)
plt.clim(0,150)
plt.colorbar()

尽管"PxN“数据数组(即,每个片段的谱图数据值)是由第一种方法生成的,并在第二种方法中重复使用。

有人知道为什么会发生这种事吗?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-08 15:19:16

首先,让我们展示一个你描述的例子,以便其他人

代码语言:javascript
运行
复制
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所做的事情:

代码语言:javascript
运行
复制
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()

使用原木色标代替

或者,我们可以在图像上使用一个日志规范并得到类似的结果,但是要更清楚地传达颜色值是在日志尺度上的:

代码语言:javascript
运行
复制
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'关闭插值)。

例如:

代码语言:javascript
运行
复制
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()

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34156050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档