我已经将一些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。但是,我正在使用大型数据集,因此执行此操作并保持原始数据不变不是特别有效。理想情况下,有一种方法可以改变绘图工具解释无限值的方式。
答案 0 :(得分:4)
Python 不是将-Inf
绘制为颜色贴图的最高颜色。它根本就没有绘制它。您可以通过切换到其中没有白色的色彩图来确认,例如'cool'
:
plt.imshow(Y, cmap='cool', interpolation='nearest', aspect='auto')
plt.show()
Python通过不渲染该补丁来处理图像中的-Inf
(以及Inf
和NaN
),让轴颜色从后面显示出来。使用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()