像频谱图一样使用颜色绘制矩阵的2D图形

3
如何使用Python绘制二维矩阵A [i,j],例如此类内容:
  • i是x轴坐标
  • j 是y轴坐标
  • A [i,j]是0到100之间的值,必须用颜色绘制(例如:0=蓝色,100=红色)
是否有Python函数可以实现此功能? (注:我不想要一个帮我进行频谱图处理的函数,例如specgram,因为我想自己计算信号的FFT;因此我只需要一个可以用颜色绘制矩阵的函数)

Spectrogram sample


1
imshow函数专门用于此任务。您可以在matplotlib图库中找到几个示例。 - David Zwicker
2
如果您有一个规则的网格,就不应该使用 pcolormesh,为什么不使用 imshow 呢? - Rutger Kassies
1
pcolorpcolormesh非常相似,但它们的性能有所不同。它们适用于不规则网格。您提供角落坐标,mpl在它们之间绘制多边形。如果您有一个沿轴具有恒定分辨率的规则网格,则imshow是更好的选择,更健壮且更快。 - Rutger Kassies
1
阅读文档!extent 关键字可能是你正在寻找的。 - David Zwicker
1
@Joe Kington,我不知道那个。但是与此主题相关的另一个区别是,在“imshow”方法中,您指定(通常是隐式的)中心坐标,而对于“pcolor”,则指定角落坐标。因此,x和y应该包含比z多一个值,否则最后一行/列将被截断。 - Rutger Kassies
显示剩余9条评论
1个回答

9

假设数组为 Z,这是我最终使用的代码:

plt.imshow(np.transpose(Z), extent=[0,4.2,0,48000], cmap='jet',
           vmin=-100, vmax=0, origin='lowest', aspect='auto')
plt.colorbar()
plt.show()

注:

  • 'jet' 是看到问题中的图像使用的色图,参见这些色图

  • 设置 origin='lowest' 具有与将 np.transpose(Z) 替换为 np.transpose(Z)[::-1,] 等效的效果

  • vminvmax 给出了尺度(在本例中从0到-100 dB)

  • extent 给出了 x 轴(此处为0到4.2秒)和 y 轴(0到48000 Hz)的范围(在此示例中,我正在绘制采样率为96Khz的长达4.2秒的音频文件的频谱图)

  • 如果未设置 aspect='auto',则绘图会非常瘦高(由于4.2与48000!)


1
仅供参考:在这种情况下使用pcolormesh没有任何问题。它比imshow略微低效,但对于中等大小的数组,您不会遇到问题。区别在于pcolorpcolormesh产生矢量输出。(即每个像素是一个多边形)如果保存为pdf或svg并编辑输出,您将看到差异。pcolor用于不规则网格,而pcolormesh是规则网格的高效版本。与imshow相比的优势是您不必覆盖纵横比,并且在某些情况下更容易指定x和y坐标。 - Joe Kington
2
同样,使用imshow也没有问题。主要区别在于光栅与矢量输出。如果您保存为光栅格式,您不会注意到任何区别。 - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接