seaborn heatmap获取颜色代码值数组

时间:2017-02-08 23:16:45

标签: python colors heatmap seaborn

我正在尝试获取与热图的每个单元关联的颜色代码:

import seaborn as sns
import numpy as np
import matplotlib.cm as cm

hm = sns.heatmap(
np.random.randn(10,10),
cmap = cm.coolwarm)

# hm.<some function>[0][0] would return the color code of the cell indexed (0,0)

2 个答案:

答案 0 :(得分:3)

由于sns.heatmap会返回matplotlib轴对象,因此我们无法直接使用hm。但是我们可以使用cmap对象本身来返回数据的rgba值。 修改代码已更新,包括数据规范化。

from matplotlib.colors import Normalize

data = np.random.randn(10, 10)
cmap = cm.get_cmap('Greens')
hm = sns.heatmap(data, cmap=cmap)

# Normalize data
norm = Normalize(vmin=data.min(), vmax=data.max())
rgba_values = cmap(norm(data))

所有颜色现在都包含在rgba_values中。因此,要获得热图中左上角的颜色,您只需执行

即可
In [13]: rgba_values[0,0]
Out[13]: array([ 0.        ,  0.26666668,  0.10588235,  1.        ])

有关详情,请查看Getting individual colors from a color map in matplotlib

<强>更新

要在调用center时使用robustsns.heatmap关键字重新调整色彩映射表,您基本上只需重新定义vminvmax。查看相关的seaborn源代码(http://github.com/mwaskom/seaborn/blob/master/seaborn/matrix.py#L202),以下更改为vminvmax应该可以解决问题。

data = np.random.randn(10, 10)
center = 2
robust = False
cmap = cm.coolwarm
hm = sns.heatmap(data, cmap=cmap, center=center, robust=robust)

vmin = np.percentile(data, 2) if robust else data.min()
vmax = np.percentile(data, 98) if robust else data.max()
vmin += center
vmax += center

norm = Normalize(vmin=vmin, vmax=vmax)
rgba_values = cmap(norm(data))

答案 1 :(得分:0)

无需对heatmap的输入数据和参数有任何了解,就可以从基础QuadMesh获取颜色,因为知道热图应该是轴内的第一个且唯一的collectionheatmap返回。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

data = np.array([[0,-2],[10,5]])
ax = sns.heatmap(data, center=0, cmap="bwr", robust=False)
im = ax.collections[0]
rgba_values = im.cmap(im.norm(im.get_array()))

另请参见this answer。与AxesImage相比,QuadMesh返回颜色列表。因此,上面的代码将为您提供一个2D数组,其中的列是RGBA颜色通道。如果您需要3D输出且前两个维度与输入数据相同,则需要重塑形状

rgba_values = rgba_values.reshape((im._meshHeight, im._meshWidth, 4))