-Inf in colormap -- 在 MATLAB 中低,在 Python 中高?

Ale*_*J93 3 python infinity colormap

我已将一些 MATLAB 代码移植到 Python,其中包括一个绘图实用程序,该实用程序可以绘制 2D 矩阵(列表)中某些数据的颜色图。MATLAB 和 Python 绘图实用程序非常相似,因此我可以毫不费力地使它们在视觉上非常接近地匹配。

我在这里使用的测试矩阵是:

X = [ 1  0  3 ]
    [ 4  5  6 ]
    [ 7  8  9 ]
Run Code Online (Sandbox Code Playgroud)

带有测试矩阵的 MATLAB

X = [1 0 3;
     4 5 6;
     7 8 9];
figure(1);
imagesc(X);
colormap(hot);
colorbar;
Run Code Online (Sandbox Code Playgroud)

带有测试矩阵的 Python

import numpy as np
import matplotlib as plt

X = [ [1,0,3] , [4,5,6] , [7,8,9] ]
fig = []
fig.append( plt.figure(1) )
plt.imshow(X, cmap='hot', interpolation='nearest', aspect='auto')
plt.colorbar()
fig[0].show()
Run Code Online (Sandbox Code Playgroud)

当我转换为 dB(取每个元素的 log10 并乘以 10)时会出现这个问题,这给了我 dB 测试矩阵

Y = [  0.0000    -Inf        4.7712 ]
    [  6.0206     6.9897     7.7815 ]
    [  8.4510     9.0309     9.5424 ]
Run Code Online (Sandbox Code Playgroud)

带有 dB 测试矩阵的 MATLAB

Y = 10*log10(X)
figure(2);
imagesc(Y);
colormap(hot);
colorbar;
Run Code Online (Sandbox Code Playgroud)

带有 dB 测试矩阵的 Python

Y = 10*np.log10(X)
fig.append( plt.figure(2) )
plt.imshow(X, cmap='hot', interpolation='nearest', aspect='auto')
plt.colorbar()
fig[1].show()
Run Code Online (Sandbox Code Playgroud)

顶部中间元素有什么关系?它是 -Inf,应该被认为是一个低值。在 MATLAB 中,它被设置为等于数组中存在的最小值,在本例中为 0。这是有道理的,因为虽然 -Inf 小于 0,但如果我们使用它的“实际值”,它会破坏缩放。

另一方面,Python 将此 -Inf 值解释为一个高值,将其设置为等于数组中的最高值 -- 9.5424。如果值只是 Inf,这对我来说非常有意义。但是,它绝对是 -Inf,它应该是。为什么这里有差异,我可以在不影响其他任何事情的情况下修复它吗?

编辑:显然我可以用 Inf 替换所有 -Inf,找到矩阵的最小值,然后用最小值替换所有 Inf。但是,我正在处理大型数据集,因此这样做并保持原始数据不变并不是特别有效。理想情况下,有一种方法可以改变绘图工具解释无限值的方式。

gno*_*ice 5

Python没有绘制-Inf为颜色图的最高颜色。它根本没有在绘制它。您可以通过切换到没有白色的颜色图来确认,例如'cool'

plt.imshow(Y, cmap='cool', interpolation='nearest', aspect='auto')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Python通过不渲染该补丁来处理-Inf(以及InfNaN)图像,使轴颜色从后面显示出来。使用 时imagesc,MATLAB 将-Inf(和NaN)设置为最低颜色图值和Inf最高颜色图值。使用 时pcolor,MATLAB 会NaN像 Python 一样通过不渲染值来处理这些值。

看起来您必须用有限值替换数组中的非有限值才能使它们呈现。或者您可以使用掩码数组

如果您只想修复此特定示例(将任何非有限值设置为黑色),您可以使用set_bad颜色图的方法:

cmap=plt.cm.hot
cmap.set_bad('k')
plt.imshow(Y, cmap=cmap, interpolation='nearest', aspect='auto')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明