在使用 LinearSegmentedColormap 时,Matplotlib文档提到有关参数 colors 的信息
颜色:类似于颜色的数组或(值,颜色)的数组。如果仅给出颜色,则它们与[0,1]范围等距映射;即0映射到颜色[0],而1映射到颜色[-1]。如果给出(值,颜色)对,则映射是从值到颜色。这可以用来不均匀地划分范围。
我有以下颜色['深红色','棕色','石灰','棕色','深红色'],我想以这种方式不均匀地划分范围:
(-1,-0.5):'深红色'
(-0.5,-0.15):'棕色'
(-0.15,0.15):'石灰'
(0.15,0.5):'棕色'
(0.5,1):'深红色'
我尝试通过以下格式传递 colors 参数:[(-1,'crimson'),(-0.5,'brown),(-0.15,'lime'),(0.15, 'brown),(0.5,'crimson')],但出现错误。我想念什么吗?
答案 0 :(得分:1)
要实现所描述的颜色分割,可以将LinearSegmentedColormap.from_list('', colors, len(colors))
与BoundaryNorm
结合使用。请注意,需要5种颜色的6个边界。
为(value, color)
使用LinearSegmentedColormap
对似乎有点麻烦,因为需要将值归一化以严格从0到1。如果需要连续的颜色范围,这将更适合并希望在特定位置(而不是特定范围)设置特定颜色。
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap, BoundaryNorm
import numpy as np
bounds = [-1, -0.5, -0.15, 0.15, 0.5, 1]
colors = ['crimson', 'brown', 'lime', 'brown', 'crimson']
cmap = LinearSegmentedColormap.from_list('', colors, N=len(colors))
norm = BoundaryNorm(bounds, ncolors=len(colors), )
x = np.random.uniform(0, 1, 100)
y = np.random.uniform(-1, 1, 100)
plt.scatter(x, y, c=y, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
请注意,您可以使用plt.colorbar(spacing='proportional')
为较大的范围显示较大的颜色块。默认值为spacing='uniform'
,每种颜色的间距均相等。
PS:关于新问题,可以使用(value, color)
的{{1}}列表创建自定义平滑色彩图,并设置额外的边界。
LinearSegmentedColormap