堆叠彩色地图

时间:2013-03-14 00:29:10

标签: python matplotlib

是否有一种简单的方法可以通过将两个现有颜色图堆叠在一起来形成新颜色图?

我想要实现的是制作另一种颜色编码的散点图,其中颜色映射变量从大的负值变为大的正值,并且我想将零值附近的值调低 - - 基本上,我希望能够从股票颜色图(例如,cm.Blues_r)中选择颜色映射变量的负值,并从另一个颜色映射变量(例如,cm.Oranges)中选择颜色对于该变量的正值。

2 个答案:

答案 0 :(得分:1)

这还没有经过测试,但作为第一步,我会尝试制作一个简单的colors.Colormap子类。

class split_cmap(colors.Colormap):
    def __init__(self, cmap_a, cmap_b, split=.5):
        '''Makes a split color map cmap_a is the low range, 
           cmap_b is the high range
           split is where to break the range
        '''
        self.cmap_a, self.cmap_b = cmap_a, cmap_b
        self.split = split

    def __call__(self, v):
        if v < self.split:
            return self.cmap_a(v) 
            # or you might want to use v / self.split
        else:
            return self.cmap_b(v) 
            # or you might want to use (v - self.split) / (1 - self.split)

    def set_bad(self,*args, **kwargs):
        self.cmap_a.set_bad(*args, **kwargs)
        self.cmap_b.set_bad(*args, **kwargs)

    def set_over(self, *args, **kwargs):
        self.cmap_a.set_over(*args, **kwargs) # not really needed
        self.cmap_b.set_over(*args, **kwargs)

    def set_under(self, *args, **kwargs):
        self.cmap_a.set_under(*args, **kwargs)
        self.cmap_b.set_under(*args, **kwargs) # not really needed

    def is_gray(self):
        return False

colors.Colormap class definition

您还需要深入了解Normalize课程。彩色地图只知道[0, 1],因此您必须确保norm映射到.5您想要进行转换的位置。

您可以概括一下这里可以获取地图和分割点列表,并拥有任意数量的彩色地图。这也需要各种方式的健全性检查。

如果您重新规范化输入,您还可以使用它来制作任何现有色彩映射的周期性版本,方法是将色彩映射及其反向合作伙伴传递给它。

答案 1 :(得分:0)

我认为自己制作色彩图更简单,特别是涉及的颜色很少时。这个是橙白蓝色。

cdict = {'red':   [ (0.0,   0.0, 0.0),
                    (0.475, 1.0, 1.0),
                    (0.525, 1.0, 1.0),
                    (1.0,   1.0, 1.0)
                  ],
         'green': [ (0.0,   0.0, 0.0),
                    (0.475, 1.0, 1.0),
                    (0.525, 1.0, 1.0),
                    (1.0,   0.65, 0.0)
                  ],
         'blue':  [ (0.0,   1.0, 1.0),
                    (0.475, 1.0, 1.0),
                    (0.525, 1.0, 1.0),
                    (1.0,   0.0, 0.0)
                  ]
}
rwb_cmap = matplotlib.colors.LinearSegmentedColormap(name = 'rwb_colormap', colors = cdict, N = 256)

色彩映射是RGB值的字典。对于每种颜色,tupples列表给出不同的段。每个分段是沿z轴的一个点,范围从0到1.这些分段的颜色是从这些分段中插入的。

segment z-axis  end      start
i       z[i]    v0[i]    v1[i]
i+1     z[i+1]  v0[i+1]  v1[i+1]   
i+2     z[i+2]  v0[i+2]  v1[i+2]   

z[i]z[i+1]之间的级别将在v1[i]v0[i+1]等之间生成颜色。这样可以“跳转”颜色。未使用v0[0]v1[-1]。您可以根据需要使用任意数量的段。 (改编自:http://matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap

N是量化级别的数量。因此,对于N = 256,它将插入256个级别的地图。我用了懒惰的256。我猜你在设置N = 6时要小心,并且你要做4个轮廓。

0.475和0.525用于确保中间轮廓真正为白色。对于级别[-1.5, -0.5, 0.5, 1.5],填充现在为橙白蓝色。如果我使用0.5而不是中间水平将是蓝色和橙色的插值。

如果比例为0-1,橙色的RGB代码为255-165-0或1-0.65-0。