Мы не можем привязать это к setTimeout()
, поскольку он всегда выполняется с глобальным объектом (Window), если вы хотите получить доступ к контексту this
в функции обратного вызова, а затем с помощью bind()
к функции обратного вызова, которую мы можем достичь как:
setTimeout(function(){
this.methodName();
}.bind(this), 2000);
Прежде всего, давайте покажем пример того, что вы описываете, чтобы другие люди
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()