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

时间:2017-07-12 19:56:58

标签: python colormap infinity

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

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

X = [ 1  0  3 ]
    [ 4  5  6 ]
    [ 7  8  9 ]

带有测试矩阵的MATLAB

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

Python with test matrix

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()

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

Y = [  0.0000    -Inf        4.7712 ]
    [  6.0206     6.9897     7.7815 ]
    [  8.4510     9.0309     9.5424 ]

带有dB测试矩阵的MATLAB

Y = 10*log10(X)
figure(2);
imagesc(Y);
colormap(hot);
colorbar;

带有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()

与中间元素有什么关系?它是-Inf,应该被视为低值。在MATLAB中,它被设置为等于数组中存在的最低值,在这种情况下为0。这是有道理的,因为当-Inf低于0时,如果我们使用它的“实际值”,它会破坏缩放。

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

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

1 个答案:

答案 0 :(得分:4)

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

plt.imshow(Y, cmap='cool', interpolation='nearest', aspect='auto')
plt.show()

enter image description here

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

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

如果您只想修复此特定的示例(将任何非限定值设置为黑色),则可以使用set_bad方法进行色彩映射:

cmap=plt.cm.hot
cmap.set_bad('k')
plt.imshow(Y, cmap=cmap, interpolation='nearest', aspect='auto')
plt.show()

enter image description here