Seaborn热图中的调色板

问题描述

在使用 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')],但出现错误。我想念什么吗?

解决方法

要实现所描述的颜色分割,可以将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','crimson']
cmap = LinearSegmentedColormap.from_list('',N=len(colors))
norm = BoundaryNorm(bounds,ncolors=len(colors),)

x = np.random.uniform(0,1,100)
y = np.random.uniform(-1,100)
plt.scatter(x,y,c=y,cmap=cmap,norm=norm)
plt.colorbar()
plt.show()

example plot

请注意,您可以使用plt.colorbar(spacing='proportional')为较大的范围显示较大的颜色块。默认值为spacing='uniform',每种颜色的间距均相等。

PS:关于新问题,可以使用(value,color)的{​​{1}}列表创建自定义平滑色彩图,并设置额外的边界。

LinearSegmentedColormap

custom smooth colors

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...