2013-03-14 96 views
2

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

我试图做到的,是使另一种颜色编码的散点图,其中颜色映射变量从大的负向变化很大的正值,我想淡化围绕零值 - - 基本上,我希望能够从库存颜色映射(例如,cm.Blues_r)中为颜色映射变量的负值选取颜色,并从另一个变量(例如,cm.Oranges)中为该变量的正值选取颜色。

回答

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你想要改变发生。

你也许可以概括这个拿地图和分割点的列表,并有尽可能多的彩色地图,只要你想。这也需要所有的健康检查方式。

如果重新恢复正常的输入,你也可以使用这种通过将其颜色映射作出的任何现有彩色地图定期版本和它的合作伙伴逆转。

+0

这是一个很棒的起点,非常感谢! – 2013-03-17 23:46:26

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) 

colormap是RGB值的字典。对于每种颜色,一个簇列表给出不同的片段。每个片段都是沿着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而不是中等级别,那么它就是蓝色和橙色的插值。

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

+0

嗯,我想基于已经存在的工作具有灵活性,但是,如果我们处于这种状态,那么请你解释1)为什么'0.475'和'0.525',2)为什么要列出3x4,3)为什么要这样做'0.65'和4)为什么'256'。如果这是额外的激励,可以将它作为一个单独的问题。 – 2013-03-14 09:32:08