有没有一种简单的方法可以通过将两个现有的颜色图堆叠在一起来形成新的颜色图?
我想要实现的是制作另一个颜色编码的散点图,其中颜色映射的变量从大的负值到大的正值不等,我想将值调低到零附近——基本上,我希望能够从库存颜色图(例如,cm.Blues_r
)中选择颜色映射变量的负值,并从不同的颜色图(例如,cm.Oranges
)中选择该变量的正值。
有没有一种简单的方法可以通过将两个现有的颜色图堆叠在一起来形成新的颜色图?
我想要实现的是制作另一个颜色编码的散点图,其中颜色映射的变量从大的负值到大的正值不等,我想将值调低到零附近——基本上,我希望能够从库存颜色图(例如,cm.Blues_r
)中选择颜色映射变量的负值,并从不同的颜色图(例如,cm.Oranges
)中选择该变量的正值。
这没有经过测试,但作为第一次通过,我会尝试制作一个简单的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
您还需要深入研究这些Normalize
课程。彩色地图只知道[0, 1]
,因此您必须确保将norm
地图映射到.5
您希望进行更改的位置。
您可能可以将其概括为获取地图和分割点列表,并根据需要拥有尽可能多的颜色地图。这也需要各种形式的健全性检查。
如果您重新规范化输入,您还可以使用它来制作任何现有颜色图的定期版本,方法是将颜色图传递给它并且它是反向伙伴。
我认为自己制作颜色图更简单,尤其是当涉及的颜色很少时。这个是橙白蓝的。
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 值的字典。对于每种颜色,元组列表给出了不同的段。每个段都是沿 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]
之间具有颜色。这使得“跳跃”颜色成为可能。并且不使用。您可以根据需要使用任意数量的细分。(改编自这里: http: //matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap)v1[i]
v0[i+1]
v0[0]
v1[-1]
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,如果比例为 0-1,则为 1-0.65-0。