Как построить Спектрограмму с очень маленькими значениями? [Дубликат]

Мы не можем привязать это к setTimeout(), поскольку он всегда выполняется с глобальным объектом (Window), если вы хотите получить доступ к контексту this в функции обратного вызова, а затем с помощью bind() к функции обратного вызова, которую мы можем достичь как:

setTimeout(function(){
    this.methodName();
}.bind(this), 2000);
3
задан Nukolas 8 December 2015 в 13:34
поделиться

1 ответ

Прежде всего, давайте покажем пример того, что вы описываете, чтобы другие люди

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. В этом случае (регулярный интервал сетки) мы также можем использовать.

Оба варианта imshow и pcolormesh являются очень хорошими вариантами, в данном случае. Однако 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()

4
ответ дан Joe Kington 21 August 2018 в 23:17
поделиться
  • 1
    Фантастично, спасибо большое, это все объясняет, и теперь я понимаю. – Nukolas 9 December 2015 в 02:15
Другие вопросы по тегам:

Похожие вопросы: