清理matplotlib imshow中好与坏数据之间的模糊边界

时间:2012-02-24 01:24:13

标签: python matplotlib

我正在尝试使用imshow显示的2D数据。数据区域为nan,并标记为屏蔽。

由于各向异性之类的东西,我使用双线性插值并希望继续这样做。使用is_bad我很确定我正在按照我想要的方式渲染蒙版值,但是纳米颜色似乎渗透到数据的良好部分导致模糊。

有没有一种方法可以加强纳米和非纳米数据之间的界面?我是否必须识别边框并在其上划一条线,或者我可以使用imshow参数执行此操作吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

嗯,这是一个复杂的解决方案,但我不知道更好的解决方案。

只是为了向那些可能不熟悉它的人说明你所讨论的问题:

import numpy as np
import matplotlib.pyplot as plt
data = np.random.random((10,10))
data[[2, 5, 7], [5, 8, 1]] = np.nan

plt.imshow(data)
plt.show()

enter image description here

模糊是因为matplotlib会插入alpha(透明度)值。改变这种情况需要进行低级调整。

但是,只要您不需要在没有数据的区域中显示图层 图层,就可以执行以下操作:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# Generate some data...
data = np.random.random((10,10))
data[[2, 5, 7], [5, 8, 1]] = np.nan

# Convert it to a masked array instead of just using nan's..
data = np.ma.masked_invalid(data)

# Plot a version with the invalid data replaced with the mean...
plt.imshow(data.filled(data.mean()))

# Now plot a white (or whatever color you'd like), nearest-interpolated array
# over the invalid values...
bad_data = np.ma.masked_where(~data.mask, data.mask)
plt.imshow(bad_data, interpolation='nearest', cmap=mpl.cm.gray_r)

plt.show()

enter image description here

如果我们不使用“填充”版本(data.filled(data.mean()))绘制原始数据,我们将在阻止的无效值周围得到“晕圈”:

enter image description here