我创建了一个这样的颜色贴图:
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)
这将很好地定义从蓝色到绿色到红色的彩虹色图。
现在我的问题是我需要在此颜色映射中的某个位置使用黑色标记。乍一看下面看起来很好:
通过使用
插入黑色边框来实现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]))
它产生
你看到绿松石部分现在被拉长了。但我需要背景中的彩虹如上所述。我可能需要在替换部分获取颜色并在我的insert
语句中使用它们。但这将涉及许多if-clauses。我的问题:是否有一种简单的方法可以根据需要设置标记?
答案 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