imshow и pcolormesh показывают два разных вывода с одним и тем же вводом

Когда я пытаюсь понять разницу между imshow и pcolormesh, я сталкиваюсь с этой проблемой, которую не могу понять, почему.

Например, у меня есть синусоида с частотой 10 кГц.

import numpy as np
import matplotlib.pyplot as plt 
from scipy import fft

f = 10000  # Frequency, in cycles per second, or Hertz
fs = 44100  # Sampling rate, or number of measurements per second

t = np.linspace(0, 5, 5 * fs, endpoint=False)
X = np.sin(f * 2 * np.pi * t)

Применение fft к этому сигналу дает спектрограмму Xs

window_size = 2048  # 2048-sample fourier windows
stride = 512        # 512 samples between windows
wps = fs/float(512) # ~86 windows/second
Xs = np.empty([int(2*wps),2048])

for i in range(Xs.shape[0]):
    Xs[i] = np.abs(fft(X[i*stride:i*stride+window_size]))

Теперь я хотел бы построить спектрограмму Xs как с imshow, так и с pcolormesh.

Имшоу

fig = plt.figure(figsize=(20,7))
plt.imshow(Xs.T,aspect='auto',cmap='seismic')
plt.gca().invert_yaxis()
plt.colorbar()

введите здесь описание изображения

цветная сетка

fig = plt.figure(figsize=(20,7))
plt.pcolormesh(Xs.T,cmap='seismic')
plt.colorbar()

введите здесь описание изображения

Почему они разные?


person Raven Cheuk    schedule 28.05.2019    source источник
comment
Если вы приблизите свои линии очень близко, они действительно будут представлены одинаково. Однако я смущен, почему это не переводится в крупномасштабную визуализацию.   -  person Patol75    schedule 28.05.2019
comment
У вас больше пикселей изображения в виде физических пикселей в графике. Следовательно, изображение необходимо пересэмплировать. Результат повторной выборки отличается, потому что imshow создает AxesImage, а pcolormesh создает QuadMesh, который представляет собой набор патчей.   -  person ImportanceOfBeingErnest    schedule 28.05.2019
comment
Я не понимаю часть пикселей изображения и физических пикселей, можете ли вы уточнить? Мой Xs имеет размерность (1000,1024), это пиксели изображения или физические пиксели?   -  person Raven Cheuk    schedule 28.05.2019
comment
Попробуйте сохранить с разрешением 300 dpi, и вы увидите разницу.   -  person Jody Klymak    schedule 28.05.2019


Ответы (1)


Интересно, что добавление аргумента dpi решает проблемы. Даже установка dpi=100, которая является значением по умолчанию, если аргумент dpi не указан, проблема все равно будет решена.

Имшоу

fig = plt.figure(figsize=(20,7), dpi=100)
plt.imshow(Xs.T,aspect='auto',cmap='seismic')
plt.gca().invert_yaxis()
plt.colorbar()

введите здесь описание изображения

Хотя аргумент dpi решает проблему, мне до сих пор не ясна его причина. Любые дополнительные предложения приветствуются.

person Raven Cheuk    schedule 31.05.2019