Python imshow和pcolormesh使用相同的输入显示两个不同的输出

Python imshow和pcolormesh使用相同的输入显示两个不同的输出,python,matplotlib,spectrogram,Python,Matplotlib,Spectrogram,当我试图理解imshow和pcolormesh之间的区别时,我遇到了这个问题,我不知道为什么 例如,我有一个频率为10kHz的正弦波 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 measurement

当我试图理解
imshow
pcolormesh
之间的区别时,我遇到了这个问题,我不知道为什么

例如,我有一个频率为10kHz的正弦波

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]))
现在我想用
imshow
pcolormesh
绘制光谱图
Xs

Imshow

多色鱼


为什么它们不同?

有趣的是,添加参数
dpi
可以解决问题。即使设置
dpi=100
,如果没有给出
dpi
参数,这是默认值,问题仍然会得到解决

Imshow


虽然
dpi
参数解决了这个问题,但我仍然不清楚它背后的原因。欢迎提出任何额外建议

有趣的是,添加参数
dpi
可以解决问题。即使设置
dpi=100
,如果没有给出
dpi
参数,这是默认值,问题仍然会得到解决

Imshow


虽然
dpi
参数解决了这个问题,但我仍然不清楚它背后的原因。欢迎提出任何额外建议

如果将直线放大到非常近的位置,则它们的表示方式确实相同。然而,我很困惑为什么这不能转化为大规模的可视化。在图形中有更多的图像像素作为物理像素。因此,图像需要重新采样。重采样的结果是不同的,因为
imshow
生成一个
AxesImage
pcolormesh
生成一个
QuadMesh
,这是一个面片集合。我不了解图像像素和物理像素部分,你能详细说明一下吗?我的
Xs
具有尺寸
(10001024)
,是图像像素还是物理像素?尝试以300 dpi保存,您将看到不同之处如果您将线条放大到非常近的位置,它们确实以相同的方式表示。然而,我很困惑为什么这不能转化为大规模的可视化。在图形中有更多的图像像素作为物理像素。因此,图像需要重新采样。重采样的结果是不同的,因为
imshow
生成一个
AxesImage
pcolormesh
生成一个
QuadMesh
,这是一个面片集合。我不了解图像像素和物理像素部分,你能详细说明一下吗?My
Xs
具有尺寸
(10001024)
,是图像像素还是物理像素?尝试以300 dpi保存,您将看到不同之处
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()
fig = plt.figure(figsize=(20,7), dpi=100)
plt.imshow(Xs.T,aspect='auto',cmap='seismic')
plt.gca().invert_yaxis()
plt.colorbar()