在颜色地图中插入标记线

时间:2017-05-18 14:40:39

标签: python matplotlib colors

我创建了一个这样的颜色贴图:

cdict = { 'red': [], 'green': [], 'blue': [] }
def addSect(pos, sect):
   for col in ('red', 'green', 'blue'):
      v = sect.pop(0)
      cdict[col].append((pos, v, v))
colSects = [(0.0, [0,0,1]) , (0.25, [0,1,1]) , (0.25, [0,1,1]) , (0.5, [0,1,0]) , (0.5, [0,1,0]) , (0.75, [1,1,0]) , (0.75, [1,1,0]) , (1.0, [1,0,0])]
for idx in range(len(colSects)):
   sect, col = colSects[idx]
   addSect(sect, col)
cmap = LinearSegmentedColormap('Fire', cdict)

这将很好地定义从蓝色到绿色到红色的彩虹色图。

enter image description here

现在我的问题是我需要在此颜色映射中的某个位置使用黑色标记。乍一看下面看起来很好:

enter image description here

通过使用

插入黑色边框来实现
colSects.insert(1, (0.2, [0,1,1]))
colSects.insert(2, (0.2, [0,0,0]))
colSects.insert(3, (0.22, [0,0,0]))
colSects.insert(4, (0.22, [0,1,1]))

但事实并非如此简单。将标记稍微向左侧放置

colSects.insert(1, (0.1, [0,1,1]))
colSects.insert(2, (0.1, [0,0,0]))
colSects.insert(3, (0.12, [0,0,0]))
colSects.insert(4, (0.12, [0,1,1]))

它产生

enter image description here

你看到绿松石部分现在被拉长了。但我需要背景中的彩虹如上所述。我可能需要在替换部分获取颜色并在我的insert语句中使用它们。但这将涉及许多if-clauses。我的问题:是否有一种简单的方法可以根据需要设置标记?

1 个答案:

答案 0 :(得分:1)

我建议通过将黑色颜色插入从原始颜色映射创建的颜色列表中,从原始颜色映射创建新的颜色映射。如果需要,这也可以使用不同的色彩图。

使用静态import matplotlib.pyplot as plt import numpy as np import matplotlib.colors data = np.linspace(0,1,num=50*50).reshape(50,50) colSects = [(0.0, [0,0,1]) ,(0.25, [0,1,1]) , (0.5, [0,1,0]) , (0.75, [1,1,0]) , (1.0, [1,0,0])] cmap = matplotlib.colors.LinearSegmentedColormap.from_list('Fire', colSects) # or use directly # cmap = plt.cm.jet def addblack(cmap, cmin,cmax): """ add black between cmin and cmax """ r = np.arange(int(cmin*255), int(cmax*255), 1) colors = cmap(np.linspace(0,1,256)) for i in r: colors[i] = (0,0,0,1) return matplotlib.colors.LinearSegmentedColormap.from_list('newcmap', colors) cmap = addblack(cmap, 0.1,0.12) plt.imshow(data, cmap=cmap) plt.colorbar() plt.show() 方法可以使一切变得更加轻松。

order

enter image description here