2013-03-14 183 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