如何在自定义色图中获得掩码值的透明度 (matplotlib/python)

4
我发现了这个有用的类MidpointNormalize,它允许您选择一个数据值来对应于您的色彩比例尺的中点颜色。有效地说,这意味着您可以通过正确重新映射区间[0,1]本身来移动您的色条的中点颜色。我需要使用这个类,并同时屏蔽某些数据值。然而,当我屏蔽某些值时,它们并没有变得透明,而是出现了过饱和的颜色。

所以:我如何使用这个MidpointNormalize类使被屏蔽的数据透明?我发布一个可运行的最小示例。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cm


class MidpointNormalize(colors.Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        colors.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
        return np.ma.masked_array(np.interp(value, x, y))


N = 100
non_masked_data = np.random.rand(N,N)*4.0-2.0
data = np.ma.masked_where(non_masked_data < -1.0, non_masked_data)

fig, ax = plt.subplots()
ax.set_axis_bgcolor('black')

norm_me = MidpointNormalize(midpoint=1.,vmin=data.min(),vmax=data.max())

plot = plt.imshow(data, origin='lower', interpolation='none', cmap="RdBu_r", norm=norm_me)
cb   = fig.colorbar(plot)
plt.show()
1个回答

4
< p > MidpointNormalize 源自这个答案,其中有一个明确的注释"我忽略了掩码值和各种边缘情况,以制作一个简单的示例"

在这种情况下,您不希望忽略掩码值。 因此,您需要将掩码传播到__call__的输出。

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

class MidpointNormalize(colors.Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        colors.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        # Note that I'm ignoring clipping and other edge cases here.
        result, is_scalar = self.process_value(value)
        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
        return np.ma.array(np.interp(value, x, y), mask=result.mask, copy=False)

N = 100
non_masked_data = np.sort(np.random.rand(N,N)*4.0-2.0)
data = np.ma.masked_where(non_masked_data < -1.0, non_masked_data)

fig, ax = plt.subplots()
ax.set_facecolor('black')

norm_me = MidpointNormalize(midpoint=1.,vmin=data.min(),vmax=data.max())
plot = plt.imshow(data, origin='lower', interpolation='none', cmap="RdBu_r", norm=norm_me)
cb   = fig.colorbar(plot)
plt.show()

我在课堂上添加了另一个注释,警告我在这里忽略了裁剪和其他边缘情况。;-)

结果如下所示,其中掩码值为透明(因此显示了黑色背景)。

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接