-Inf in colormap -- 在 MATLAB 中低,在 Python 中高?
-Inf in colormap -- low in MATLAB, high in Python?
我已经将一些 MATLAB 代码移植到 Python,包括一个绘图实用程序,它可以在二维矩阵(列表)中绘制一些数据的颜色图。 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 带测试矩阵
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;
Python 带 dB 测试矩阵
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 时,如果我们使用它 "actual value".
,它会破坏缩放比例
另一方面,Python 将此 -Inf 值解释为一个高值,将其设置为等于数组中的最高值 -- 9.5424。如果该值只是 Inf,这对我来说非常有意义。但是,它肯定是 -Inf,因为它应该是。为什么这里有差异,我可以在不影响其他的情况下修复它吗?
编辑:显然我可以用 Inf 替换所有 -Inf,找到矩阵的最小值,然后用最小值替换所有 Inf。但是,我正在处理大型数据集,因此执行此操作并保持原始数据完好无损并不是特别有效。理想情况下,会有一种方法可以改变绘图工具解释无限值的方式。
Python 不是绘制-Inf
作为颜色图的最高颜色。它根本就不是在策划它。您可以通过切换到其中没有白色的颜色图来确认,例如 'cool'
:
plt.imshow(Y, cmap='cool', interpolation='nearest', aspect='auto')
plt.show()
Python 通过不渲染该补丁来处理图像中的 -Inf
(以及 Inf
和 NaN
),让轴颜色从后面显示出来.使用 imagesc
, MATLAB sets -Inf
(and NaN
) to the lowest colormap value and Inf
to the highest colormap value. When using pcolor
时,MATLAB 通过不渲染来处理 NaN
值,例如 Python。
看来您必须将数组中的非有限值替换为有限值才能呈现它们。或者您可以使用 masked array.
如果您只是想修正这个特定的示例(将任何非有限值设置为黑色),您可以对颜色图使用set_bad
方法:
cmap=plt.cm.hot
cmap.set_bad('k')
plt.imshow(Y, cmap=cmap, interpolation='nearest', aspect='auto')
plt.show()
我已经将一些 MATLAB 代码移植到 Python,包括一个绘图实用程序,它可以在二维矩阵(列表)中绘制一些数据的颜色图。 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 带测试矩阵
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;
Python 带 dB 测试矩阵
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 时,如果我们使用它 "actual value".
,它会破坏缩放比例另一方面,Python 将此 -Inf 值解释为一个高值,将其设置为等于数组中的最高值 -- 9.5424。如果该值只是 Inf,这对我来说非常有意义。但是,它肯定是 -Inf,因为它应该是。为什么这里有差异,我可以在不影响其他的情况下修复它吗?
编辑:显然我可以用 Inf 替换所有 -Inf,找到矩阵的最小值,然后用最小值替换所有 Inf。但是,我正在处理大型数据集,因此执行此操作并保持原始数据完好无损并不是特别有效。理想情况下,会有一种方法可以改变绘图工具解释无限值的方式。
Python 不是绘制-Inf
作为颜色图的最高颜色。它根本就不是在策划它。您可以通过切换到其中没有白色的颜色图来确认,例如 'cool'
:
plt.imshow(Y, cmap='cool', interpolation='nearest', aspect='auto')
plt.show()
Python 通过不渲染该补丁来处理图像中的 -Inf
(以及 Inf
和 NaN
),让轴颜色从后面显示出来.使用 imagesc
, MATLAB sets -Inf
(and NaN
) to the lowest colormap value and Inf
to the highest colormap value. When using pcolor
时,MATLAB 通过不渲染来处理 NaN
值,例如 Python。
看来您必须将数组中的非有限值替换为有限值才能呈现它们。或者您可以使用 masked array.
如果您只是想修正这个特定的示例(将任何非有限值设置为黑色),您可以对颜色图使用set_bad
方法:
cmap=plt.cm.hot
cmap.set_bad('k')
plt.imshow(Y, cmap=cmap, interpolation='nearest', aspect='auto')
plt.show()